diff --git a/acer_e350_simcom75/lcm/TM070DDH03/TM070DDH03.c b/acer_e350_simcom75/lcm/TM070DDH03/TM070DDH03.c new file mode 100644 index 0000000..60e695f --- /dev/null +++ b/acer_e350_simcom75/lcm/TM070DDH03/TM070DDH03.c @@ -0,0 +1,247 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ +#ifdef BUILD_UBOOT + // do nothing in uboot +#else + lcm_util.set_gpio_mode(GPIO12, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO12, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO12, GPIO_OUT_ONE); // LCM_STBY + MDELAY(50); + lcm_util.set_gpio_mode(GPIO14, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO14, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO14, GPIO_OUT_ONE); // LCM_RST + //SET_RESET_PIN(1); // LCM_RST + MDELAY(50); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(120); +#endif +} + + +static void lcm_suspend(void) +{ + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + MDELAY(10); + lcm_util.set_gpio_mode(GPIO12, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO12, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO12, GPIO_OUT_ZERO); // LCM_STBY + MDELAY(50); + lcm_util.set_gpio_mode(GPIO14, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO14, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO14, GPIO_OUT_ZERO); // LCM_RST + //SET_RESET_PIN(0); // LCM_RST + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + lcm_util.set_gpio_mode(GPIO12, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO12, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO12, GPIO_OUT_ONE); // LCM_STBY + MDELAY(50); + lcm_util.set_gpio_mode(GPIO14, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO14, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO14, GPIO_OUT_ONE); // LCM_RST + //SET_RESET_PIN(1); // LCM_RST + MDELAY(50); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(120); +} + +LCM_DRIVER tm070ddh03_lcm_drv = +{ + .name = "tm070ddh03", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/acer_e350_simcom75/lcm/blg9056b_wvga_otm8018b/blg9056b_wvga_otm8018b.c b/acer_e350_simcom75/lcm/blg9056b_wvga_otm8018b/blg9056b_wvga_otm8018b.c new file mode 100644 index 0000000..76e6db6 --- /dev/null +++ b/acer_e350_simcom75/lcm/blg9056b_wvga_otm8018b/blg9056b_wvga_otm8018b.c @@ -0,0 +1,694 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID 0x8009 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + + +static __inline unsigned char spi_get_byte(unsigned int reg) +{ + unsigned int i; + int k; + unsigned char getbyte=0; + + // reg = (CTRL_ID | (reg & 0xFF)); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + SET_LSCE_LOW; + UDELAY(1); + + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (reg & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + reg <<= 1; + } + + UDELAY(2); + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + SET_LSCK_HIGH; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte |= (1 << k); + } + + } + + UDELAY(2); + + SET_LSDA_HIGH; + SET_LSCE_HIGH; + + return getbyte; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); + +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + + set_lcm_register(0xFF00,0x80); + set_lcm_register(0xFF01,0x09); //enable EXTC + set_lcm_register(0xFF02,0x01); + set_lcm_register(0xFF80,0x80); //enable Orise mode + set_lcm_register(0xFF81,0x09); + set_lcm_register(0xFF03,0x01); //enable SPI+I2C cmd2 read + + //gamma DC + set_lcm_register(0xC0b4,0x10); //column inversion 0x50//10 + set_lcm_register(0xC489,0x08); //reg off + set_lcm_register(0xC0a3,0x00); //pre-charge //V02 + set_lcm_register(0xC582,0xA3); //REG-pump23 + set_lcm_register(0xC590,0xd6); //Pump setting (3x=D6)-->(2x=96)//v02 01/11 0xD6 + set_lcm_register(0xC591,0x87); //Pump setting(VGH/VGL) 0x87 + set_lcm_register(0xD800,0x70); //GVDD=4.5V /73 /74 + set_lcm_register(0xD801,0x6e); //NGVDD=4.5V /71 /72 + + //VCOMDC + set_lcm_register(0xD900,0x60); // VCOMDC= 0x5c /5c//60 + MDELAY(20); + + //Positive + set_lcm_register(0xE100,0x09); + set_lcm_register(0xE101,0x0b); + set_lcm_register(0xE102,0x11); + set_lcm_register(0xE103,0x0f); + set_lcm_register(0xE104,0x09); + set_lcm_register(0xE105,0x1a); + set_lcm_register(0xE106,0x0b); + set_lcm_register(0xE107,0x0b); + set_lcm_register(0xE108,0x01); + set_lcm_register(0xE109,0x05); + set_lcm_register(0xE10A,0x03); + set_lcm_register(0xE10B,0x08); + set_lcm_register(0xE10C,0x0e); + set_lcm_register(0xE10D,0x26); + set_lcm_register(0xE10E,0x23); + set_lcm_register(0xE10F,0x18); + + //Negative + set_lcm_register(0xE200,0x09); + set_lcm_register(0xE201,0x0b); + set_lcm_register(0xE202,0x11); + set_lcm_register(0xE203,0x0f); + set_lcm_register(0xE204,0x09); + set_lcm_register(0xE205,0x1a); + set_lcm_register(0xE206,0x0b); + set_lcm_register(0xE207,0x0b); + set_lcm_register(0xE208,0x01); + set_lcm_register(0xE209,0x05); + set_lcm_register(0xE20A,0x03); + set_lcm_register(0xE20B,0x08); + set_lcm_register(0xE20C,0x0e); + set_lcm_register(0xE20D,0x26); + set_lcm_register(0xE20E,0x23); + set_lcm_register(0xE20F,0x18); + + // + set_lcm_register(0xC181,0x66); //Frame rate 65Hz//V02 /6f + + //RGB I/F setting VSYNC for OTM8018 0x0e + set_lcm_register(0xC1a1,0x08); //external Vsync,Hsync,DE + //set_lcm_register(0xC0,0xa3,0x1b); //pre-charge //V02 + set_lcm_register(0xC481,0x83); //source bias //V02 + set_lcm_register(0xC592,0x01); //Pump45 + set_lcm_register(0xC5b1,0xa9); //DC voltage setting ;[0]GVDD output, default: 0xa8 + set_lcm_register(0xC480,0x30); //no display source output=GND / + + + // CE8x : vst1, vst2, vst3, vst4 + set_lcm_register(0xCE80,0x85); // ce81[7:0] : vst1_shift[7:0] + set_lcm_register(0xCE81,0x03); // ce82[7:0] : 0000, vst1_width[3:0] + set_lcm_register(0xCE82,0x00); // ce83[7:0] : vst1_tchop[7:0] + set_lcm_register(0xCE83,0x84); // ce84[7:0] : vst2_shift[7:0] + set_lcm_register(0xCE84,0x03); // ce85[7:0] : 0000, vst2_width[3:0] + set_lcm_register(0xCE85,0x00); // ce86[7:0] : vst2_tchop[7:0] + + set_lcm_register(0xCE86,0x83); //vst3_shift[7:0] + + set_lcm_register(0xCE87,0x03); // ce88[7:0] : 0000, vst3_width[3:0] + set_lcm_register(0xCE88,0x00); // ce89[7:0] : vst3_tchop[7:0] + + set_lcm_register(0xCE89,0x82); // ce8a[7:0] : vst4_shift[7:0] + set_lcm_register(0xCE8a,0x03); // ce8b[7:0] : 0000, vst4_width[3:0] + set_lcm_register(0xCE8b,0x00); // ce8c[7:0] : vst4_tchop[7:0] + + //CEAx : clka1, clka2 + set_lcm_register(0xCEa0,0x38); // cea1[7:0] : clka1_width[3:0], clka1_shift[11:8] + set_lcm_register(0xCEa1,0x02); // cea2[7:0] : clka1_shift[7:0] + set_lcm_register(0xCEa2,0x03); // cea3[7:0] : clka1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEa3,0x21); // cea4[7:0] : clka1_switch[7:0] + set_lcm_register(0xCEa4,0x00); // cea5[7:0] : clka1_extend[7:0] + set_lcm_register(0xCEa5,0x00); // cea6[7:0] : clka1_tchop[7:0] + set_lcm_register(0xCEa6,0x00); // cea7[7:0] : clka1_tglue[7:0] + set_lcm_register(0xCEa7,0x38); // cea8[7:0] : clka2_width[3:0], clka2_shift[11:8] + set_lcm_register(0xCEa8,0x01); // cea9[7:0] : clka2_shift[7:0] + set_lcm_register(0xCEa9,0x03); // ceaa[7:0] : clka2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEaa,0x22); // ceab[7:0] : clka2_switch[7:0] + set_lcm_register(0xCEab,0x00); // ceac[7:0] : clka2_extend + set_lcm_register(0xCEac,0x00); // cead[7:0] : clka2_tchop + set_lcm_register(0xCEad,0x00); // ceae[7:0] : clka2_tglue + + //CEBx : clka3, clka4 + set_lcm_register(0xCEb0,0x38); // ceb1[7:0] : clka3_width[3:0], clka3_shift[11:8] + set_lcm_register(0xCEb1,0x00); // ceb2[7:0] : clka3_shift[7:0] + set_lcm_register(0xCEb2,0x03); // ceb3[7:0] : clka3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEb3,0x23); // ceb4[7:0] : clka3_switch[7:0] + set_lcm_register(0xCEb4,0x00); // ceb5[7:0] : clka3_extend[7:0] + set_lcm_register(0xCEb5,0x00); // ceb6[7:0] : clka3_tchop[7:0] + set_lcm_register(0xCEb6,0x00); // ceb7[7:0] : clka3_tglue[7:0] + set_lcm_register(0xCEb7,0x30); // ceb8[7:0] : clka4_width[3:0], clka2_shift[11:8] + set_lcm_register(0xCEb8,0x00); // ceb9[7:0] : clka4_shift[7:0] + set_lcm_register(0xCEb9,0x03); // ceba[7:0] : clka4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEba,0x24); // cebb[7:0] : clka4_switch[7:0] + set_lcm_register(0xCEbb,0x00); // cebc[7:0] : clka4_extend + set_lcm_register(0xCEbc,0x00); // cebd[7:0] : clka4_tchop + set_lcm_register(0xCEbd,0x00); // cebe[7:0] : clka4_tglue + + //CECx : clkb1, clkb2 + set_lcm_register(0xCEc0,0x30); // cec1[7:0] : clkb1_width[3:0], clkb1_shift[11:8] + set_lcm_register(0xCEc1,0x01); // cec2[7:0] : clkb1_shift[7:0] + set_lcm_register(0xCEc2,0x03); // cec3[7:0] : clkb1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEc3,0x25); // cec4[7:0] : clkb1_switch[7:0] + set_lcm_register(0xCEc4,0x00); // cec5[7:0] : clkb1_extend[7:0] + set_lcm_register(0xCEc5,0x00); // cec6[7:0] : clkb1_tchop[7:0] + set_lcm_register(0xCEc6,0x00); // cec7[7:0] : clkb1_tglue[7:0] + set_lcm_register(0xCEc7,0x30); // cec8[7:0] : clkb2_width[3:0], clkb2_shift[11:8] + set_lcm_register(0xCEc8,0x02); // cec9[7:0] : clkb2_shift[7:0] + set_lcm_register(0xCEc9,0x03); // ceca[7:0] : clkb2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEca,0x26); // cecb[7:0] : clkb2_switch[7:0] + set_lcm_register(0xCEcb,0x00); // cecc[7:0] : clkb2_extend + set_lcm_register(0xCEcc,0x00); // cecd[7:0] : clkb2_tchop + set_lcm_register(0xCEcd,0x00); // cece[7:0] : clkb2_tglue + + //CEDx : clkb3, clkb4 + set_lcm_register(0xCEd0,0x30); // ced1[7:0] : clkb3_width[3:0], clkb3_shift[11:8] + set_lcm_register(0xCEd1,0x03); // ced2[7:0] : clkb3_shift[7:0] + set_lcm_register(0xCEd2,0x03); // ced3[7:0] : clkb3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEd3,0x27); // ced4[7:0] : clkb3_switch[7:0] + set_lcm_register(0xCEd4,0x00); // ced5[7:0] : clkb3_extend[7:0] + set_lcm_register(0xCEd5,0x00); // ced6[7:0] : clkb3_tchop[7:0] + set_lcm_register(0xCEd6,0x00); // ced7[7:0] : clkb3_tglue[7:0] + set_lcm_register(0xCEd7,0x30); // ced8[7:0] : clkb4_width[3:0], clkb4_shift[11:8] + set_lcm_register(0xCEd8,0x04); // ced9[7:0] : clkb4_shift[7:0] + set_lcm_register(0xCEd9,0x03); // ceda[7:0] : clkb4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEda,0x28); // cedb[7:0] : clkb4_switch[7:0] + set_lcm_register(0xCEdb,0x00); // cedc[7:0] : clkb4_extend + set_lcm_register(0xCEdc,0x00); // cedd[7:0] : clkb4_tchop + set_lcm_register(0xCEdd,0x00); // cede[7:0] : clkb4_tglue + + //CFCx : + set_lcm_register(0xCFc0,0x00); // cfc1[7:0] : eclk_normal_width[7:0] + set_lcm_register(0xCFc1,0x00); // cfc2[7:0] : eclk_partial_width[7:0] + set_lcm_register(0xCFc2,0x00); // cfc3[7:0] : all_normal_tchop[7:0] + set_lcm_register(0xCFc3,0x00); // cfc4[7:0] : all_partial_tchop[7:0] + set_lcm_register(0xCFc4,0x00); // cfc5[7:0] : eclk1_follow[3:0], eclk2_follow[3:0] + set_lcm_register(0xCFc5,0x00); // cfc6[7:0] : eclk3_follow[3:0], eclk4_follow[3:0] + set_lcm_register(0xCFc6,0x00); // cfc7[7:0] : 00, vstmask, vendmask, 00, dir1, dir2 (0=VGL, 1=VGH) + set_lcm_register(0xCFc7,0x00); // cfc8[7:0] : reg_goa_gnd_opt, reg_goa_dpgm_tail_set, reg_goa_f_gating_en, + set_lcm_register(0xCFc8,0x00); // cfc9[7:0] : duty_block[3:0], DGPM[3:0] + set_lcm_register(0xCFc9,0x00); // cfca[7:0] : reg_goa_gnd_period[7:0] + + //CFDx : + set_lcm_register(0xCFD0,0x00); // cfd1[7:0] : 0000000, reg_goa_frame_odd_high + + // cbcx + set_lcm_register(0xCBc0,0x00); //cbc1[7:0] : enmode H-byte of sig1 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc1,0x00); //cbc2[7:0] : enmode H-byte of sig2 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc2,0x00); //cbc3[7:0] : enmode H-byte of sig3 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc3,0x00); //cbc4[7:0] : enmode H-byte of sig4 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc4,0x04); //cbc5[7:0] : enmode H-byte of sig5 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc5,0x04); //cbc6[7:0] : enmode H-byte of sig6 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc6,0x04); //cbc7[7:0] : enmode H-byte of sig7 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc7,0x04); //cbc8[7:0] : enmode H-byte of sig8 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc8,0x04); //cbc9[7:0] : enmode H-byte of sig9 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc9,0x04); //cbca[7:0] : enmode H-byte of sig10 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBca,0x00); //cbcb[7:0] : enmode H-byte of sig11 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcb,0x00); //cbcc[7:0] : enmode H-byte of sig12 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcc,0x00); //cbcd[7:0] : enmode H-byte of sig13 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcd,0x00); //cbce[7:0] : enmode H-byte of sig14 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBce,0x00); //cbcf[7:0] : enmode H-byte of sig15 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cbdx : + set_lcm_register(0xCBd0,0x00); //cbd1[7:0] : enmode H-byte of sig16 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd1,0x00); //cbd2[7:0] : enmode H-byte of sig17 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd2,0x00); //cbd3[7:0] : enmode H-byte of sig18 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd3,0x00); //cbd4[7:0] : enmode H-byte of sig19 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd4,0x00); //cbd5[7:0] : enmode H-byte of sig20 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd5,0x00); //cbd6[7:0] : enmode H-byte of sig21 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd6,0x00); //cbd7[7:0] : enmode H-byte of sig22 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd7,0x00); //cbd8[7:0] : enmode H-byte of sig23 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd8,0x00); //cbd9[7:0] : enmode H-byte of sig24 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd9,0x04); //cbda[7:0] : enmode H-byte of sig25 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdA,0x04); //cbdb[7:0] : enmode H-byte of sig26 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdb,0x04); //cbdc[7:0] : enmode H-byte of sig27 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdC,0x04); //cbdd[7:0] : enmode H-byte of sig28 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdd,0x04); //cbde[7:0] : enmode H-byte of sig29 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBde,0x04); //cbdf[7:0] : enmode H-byte of sig30 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cbex + set_lcm_register(0xCBe0,0x00); //cbe1[7:0] : enmode H-byte of sig31 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe1,0x00); //cbe2[7:0] : enmode H-byte of sig32 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe2,0x00); //cbe3[7:0] : enmode H-byte of sig33 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe3,0x00); //cbe4[7:0] : enmode H-byte of sig34 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe4,0x00); //cbe5[7:0] : enmode H-byte of sig35 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe5,0x00); //cbe6[7:0] : enmode H-byte of sig36 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe6,0x00); //cbe7[7:0] : enmode H-byte of sig37 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe7,0x00); //cbe8[7:0] : enmode H-byte of sig38 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe8,0x00); //cbe9[7:0] : enmode H-byte of sig39 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe9,0x00); //cbea[7:0] : enmode H-byte of sig40 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cc8x + set_lcm_register(0xCC80,0x00); //cc81[7:0] : reg setting for signal01 selection with u2d mode + set_lcm_register(0xCC81,0x00); //cc82[7:0] : reg setting for signal02 selection with u2d mode + set_lcm_register(0xCC82,0x00); //cc83[7:0] : reg setting for signal03 selection with u2d mode + set_lcm_register(0xCC83,0x00); //cc84[7:0] : reg setting for signal04 selection with u2d mode + set_lcm_register(0xCC84,0x0C); //cc85[7:0] : reg setting for signal05 selection with u2d mode + set_lcm_register(0xCC85,0x0A); //cc86[7:0] : reg setting for signal06 selection with u2d mode + set_lcm_register(0xCC86,0x10); //cc87[7:0] : reg setting for signal07 selection with u2d mode + set_lcm_register(0xCC87,0x0E); //cc88[7:0] : reg setting for signal08 selection with u2d mode + set_lcm_register(0xCC88,0x03); //cc89[7:0] : reg setting for signal09 selection with u2d mode + set_lcm_register(0xCC89,0x04); //cc8a[7:0] : reg setting for signal10 selection with u2d mode + + // cc9x + set_lcm_register(0xCC90,0x00); //cc91[7:0] : reg setting for signal11 selection with u2d mode + set_lcm_register(0xCC91,0x00); //cc92[7:0] : reg setting for signal12 selection with u2d mode + set_lcm_register(0xCC92,0x00); //cc93[7:0] : reg setting for signal13 selection with u2d mode + set_lcm_register(0xCC93,0x00); //cc94[7:0] : reg setting for signal14 selection with u2d mode + set_lcm_register(0xCC94,0x00); //cc95[7:0] : reg setting for signal15 selection with u2d mode + set_lcm_register(0xCC95,0x00); //cc96[7:0] : reg setting for signal16 selection with u2d mode + set_lcm_register(0xCC96,0x00); //cc97[7:0] : reg setting for signal17 selection with u2d mode + set_lcm_register(0xCC97,0x00); //cc98[7:0] : reg setting for signal18 selection with u2d mode + set_lcm_register(0xCC98,0x00); //cc99[7:0] : reg setting for signal19 selection with u2d mode + set_lcm_register(0xCC99,0x00); //cc9a[7:0] : reg setting for signal20 selection with u2d mode + set_lcm_register(0xCC9a,0x00); //cc9b[7:0] : reg setting for signal21 selection with u2d mode + set_lcm_register(0xCC9b,0x00); //cc9c[7:0] : reg setting for signal22 selection with u2d mode + set_lcm_register(0xCC9c,0x00); //cc9d[7:0] : reg setting for signal23 selection with u2d mode + set_lcm_register(0xCC9d,0x00); //cc9e[7:0] : reg setting for signal24 selection with u2d mode + set_lcm_register(0xCC9e,0x0B); //cc9f[7:0] : reg setting for signal25 selection with u2d mode + + // ccax + set_lcm_register(0xCCa0,0x09); //cca1[7:0] : reg setting for signal26 selection with u2d mode + set_lcm_register(0xCCa1,0x0F); //cca2[7:0] : reg setting for signal27 selection with u2d mode + set_lcm_register(0xCCa2,0x0D); //cca3[7:0] : reg setting for signal28 selection with u2d mode + set_lcm_register(0xCCa3,0x01); //cca4[7:0] : reg setting for signal29 selection with u2d mode + set_lcm_register(0xCCa4,0x02); //cca5[7:0] : reg setting for signal20 selection with u2d mode + set_lcm_register(0xCCa5,0x00); //cca6[7:0] : reg setting for signal31 selection with u2d mode + set_lcm_register(0xCCa6,0x00); //cca7[7:0] : reg setting for signal32 selection with u2d mode + set_lcm_register(0xCCa7,0x00); //cca8[7:0] : reg setting for signal33 selection with u2d mode + set_lcm_register(0xCCa8,0x00); //cca9[7:0] : reg setting for signal34 selection with u2d mode + set_lcm_register(0xCCa9,0x00); //ccaa[7:0] : reg setting for signal35 selection with u2d mode + set_lcm_register(0xCCaa,0x00); //ccab[7:0] : reg setting for signal36 selection with u2d mode + set_lcm_register(0xCCab,0x00); //ccac[7:0] : reg setting for signal37 selection with u2d mode + set_lcm_register(0xCCac,0x00); //ccad[7:0] : reg setting for signal38 selection with u2d mode + set_lcm_register(0xCCad,0x00); //ccae[7:0] : reg setting for signal39 selection with u2d mode + set_lcm_register(0xCCae,0x00); //ccaf[7:0] : reg setting for signal40 selection with u2d mode + + // ccbx + set_lcm_register(0xCCb0,0x00); //ccb1[7:0] : reg setting for signal01 selection with d2u mode + set_lcm_register(0xCCb1,0x00); //ccb2[7:0] : reg setting for signal02 selection with d2u mode + set_lcm_register(0xCCb2,0x00); //ccb3[7:0] : reg setting for signal03 selection with d2u mode + set_lcm_register(0xCCb3,0x00); //ccb4[7:0] : reg setting for signal04 selection with d2u mode + set_lcm_register(0xCCb4,0x0D); //ccb5[7:0] : reg setting for signal05 selection with d2u mode + set_lcm_register(0xCCb5,0x0F); //ccb6[7:0] : reg setting for signal06 selection with d2u mode + set_lcm_register(0xCCb6,0x09); //ccb7[7:0] : reg setting for signal07 selection with d2u mode + set_lcm_register(0xCCb7,0x0B); //ccb8[7:0] : reg setting for signal08 selection with d2u mode + set_lcm_register(0xCCb8,0x02); //ccb9[7:0] : reg setting for signal09 selection with d2u mode + set_lcm_register(0xCCb9,0x01); //ccba[7:0] : reg setting for signal10 selection with d2u mode + + // cccx + set_lcm_register(0xCCc0,0x00); //ccc1[7:0] : reg setting for signal11 selection with d2u mode + set_lcm_register(0xCCc1,0x00); //ccc2[7:0] : reg setting for signal12 selection with d2u mode + set_lcm_register(0xCCc2,0x00); //ccc3[7:0] : reg setting for signal13 selection with d2u mode + set_lcm_register(0xCCc3,0x00); //ccc4[7:0] : reg setting for signal14 selection with d2u mode + set_lcm_register(0xCCc4,0x00); //ccc5[7:0] : reg setting for signal15 selection with d2u mode + set_lcm_register(0xCCc5,0x00); //ccc6[7:0] : reg setting for signal16 selection with d2u mode + set_lcm_register(0xCCc6,0x00); //ccc7[7:0] : reg setting for signal17 selection with d2u mode + set_lcm_register(0xCCc7,0x00); //ccc8[7:0] : reg setting for signal18 selection with d2u mode + set_lcm_register(0xCCc8,0x00); //ccc9[7:0] : reg setting for signal19 selection with d2u mode + set_lcm_register(0xCCc9,0x00); //ccca[7:0] : reg setting for signal20 selection with d2u mode + set_lcm_register(0xCCca,0x00); //cccb[7:0] : reg setting for signal21 selection with d2u mode + set_lcm_register(0xCCcb,0x00); //cccc[7:0] : reg setting for signal22 selection with d2u mode + set_lcm_register(0xCCcc,0x00); //cccd[7:0] : reg setting for signal23 selection with d2u mode + set_lcm_register(0xCCcd,0x00); //ccce[7:0] : reg setting for signal24 selection with d2u mode + set_lcm_register(0xCCce,0x0E); //cccf[7:0] : reg setting for signal25 selection with d2u mode + + // ccdx + set_lcm_register(0xCCd0,0x10); //ccd1[7:0] : reg setting for signal26 selection with d2u mode + set_lcm_register(0xCCd1,0x0A); //ccd2[7:0] : reg setting for signal27 selection with d2u mode + set_lcm_register(0xCCd2,0x0C); //ccd3[7:0] : reg setting for signal28 selection with d2u mode + set_lcm_register(0xCCd3,0x04); //ccd4[7:0] : reg setting for signal29 selection with d2u mode + set_lcm_register(0xCCd4,0x03); //ccd5[7:0] : reg setting for signal30 selection with d2u mode + set_lcm_register(0xCCd5,0x00); //ccd6[7:0] : reg setting for signal31 selection with d2u mode + set_lcm_register(0xCCd6,0x00); //ccd7[7:0] : reg setting for signal32 selection with d2u mode + set_lcm_register(0xCCd7,0x00); //ccd8[7:0] : reg setting for signal33 selection with d2u mode + set_lcm_register(0xCCd8,0x00); //ccd9[7:0] : reg setting for signal34 selection with d2u mode + set_lcm_register(0xCCd9,0x00); //ccda[7:0] : reg setting for signal35 selection with d2u mode + set_lcm_register(0xCCda,0x00); //ccdb[7:0] : reg setting for signal36 selection with d2u mode + set_lcm_register(0xCCdb,0x00); //ccdc[7:0] : reg setting for signal37 selection with d2u mode + set_lcm_register(0xCCdc,0x00); //ccdd[7:0] : reg setting for signal38 selection with d2u mode + set_lcm_register(0xCCdd,0x00); //ccde[7:0] : reg setting for signal39 selection with d2u mode + set_lcm_register(0xCCde,0x00); //ccdf[7:0] : reg setting for signal40 selection with d2u mode + + ///=====================); set_lcm_register(0x======== + set_lcm_register(0x3A00,0x77); //MCU 16bits D[17:0] 77 66 / + send_ctrl_cmd(0x1100); + MDELAY(200); // 120 / + send_ctrl_cmd(0x2900); + MDELAY(100); //200 / + +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0);//input + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, 0); + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 16; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 16; + params->dpi.vsync_front_porch = 16; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(200); + + init_lcm_registers(); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0,id1=0,id2=0; + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(200); + + send_ctrl_cmd(0xd200); + spi_get_byte(0xc0); //spi_read_data(); + spi_get_byte(0xc0); //spi_read_data(); + spi_get_byte(0xc0); //spi_read_data(); + id1 = spi_get_byte(0xc0); //spi_read_data(); + id2 = spi_get_byte(0xc0); //spi_read_data(); + MDELAY(20); + id = id1<<8 | id2; +#ifdef BUILD_UBOOT + printf("11111111111111111tengdeqianglcd_id222222222222222222=%x \r\n",id); +#else + printk("11111111111111111tengdeqianglcd_id2222222222222222222 id=%x,id1=%x,id2=%x\r\n",id,id1,id2); +#endif + + return (LCM_ID == id)?1:0; +} + +static void lcm_suspend(void) +{ + //lcm_compare_id(); + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); +} + +static void lcm_resume(void) +{ + + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(100); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER blg9056b_wvga_otm8018b_lcm_drv = +{ + + .name = "blg9056b_wvga_otm8018b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id, +}; diff --git a/acer_e350_simcom75/lcm/bm8578/bm8578.c b/acer_e350_simcom75/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..d854dc2 --- /dev/null +++ b/acer_e350_simcom75/lcm/bm8578/bm8578.c @@ -0,0 +1,339 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/dj3065a_wvga_hx8369a/dj3065a_wvga_hx8369a.c b/acer_e350_simcom75/lcm/dj3065a_wvga_hx8369a/dj3065a_wvga_hx8369a.c new file mode 100755 index 0000000..6a82770 --- /dev/null +++ b/acer_e350_simcom75/lcm/dj3065a_wvga_hx8369a/dj3065a_wvga_hx8369a.c @@ -0,0 +1,534 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +//chenhaojun +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x8369 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) +static __inline void send_ctrl_cmd(unsigned char cmd) +{ + unsigned char i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + SET_LSCK_LOW; + UDELAY(1); + SET_LSDA_LOW;//A0=0 + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (cmd & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + cmd <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline void send_data_cmd(unsigned char data) +{ + unsigned char i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + SET_LSCK_LOW; + UDELAY(1); + SET_LSDA_HIGH;//A0=1 + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline void set_lcm_register(unsigned char regIndex, + unsigned char regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static __inline void backlight_ctrl(unsigned char cmd) +{ + /*N/A*/ + return; +} + +static void init_lcm_registers(void) +{ + +/* +customer:AUX[V900] +module id:90-24045-3065A[dijing] +LCM IC:HX8369-A +glass:HSD3.97 +resolution:wvga(480*800) +*/ + //int i = 0; + send_ctrl_cmd(0xB9); + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); + send_data_cmd(0x01); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x0E); + send_data_cmd(0x0E); + send_data_cmd(0x21); + send_data_cmd(0x29); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); + send_data_cmd(0x00); + send_data_cmd(0x23); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_ctrl_cmd(0xB3); // set rgb if + send_data_cmd(0x01); + send_ctrl_cmd(0xB4); + send_data_cmd(0x0A); + send_data_cmd(0x0C); + send_data_cmd(0x84); + send_data_cmd(0x0C); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB6); + //send_data_cmd(0x1F); + //send_data_cmd(0x1F); + send_data_cmd(0x28); // 0x30//0x2F + send_data_cmd(0x28);// 0x30 + + send_ctrl_cmd(0xCC); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x07); + send_data_cmd(0x10); + send_data_cmd(0x80); + send_data_cmd(0x63); + send_data_cmd(0x27); + send_data_cmd(0x01); + send_data_cmd(0x22); + send_data_cmd(0xB9); + send_data_cmd(0x75); + send_data_cmd(0xA8); + send_data_cmd(0x64); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x07); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x09); + send_data_cmd(0x09); + send_data_cmd(0x21); + send_data_cmd(0x1B); + send_data_cmd(0x2d);//send_data_cmd(0x31); + send_data_cmd(0x06); + send_data_cmd(0x0C); + send_data_cmd(0x10); + send_data_cmd(0x15); + send_data_cmd(0x16); + send_data_cmd(0x14); + send_data_cmd(0x16); + send_data_cmd(0x12); + send_data_cmd(0x18); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x09); + send_data_cmd(0x09); + send_data_cmd(0x21); + send_data_cmd(0x1B); + send_data_cmd(0x2D); + send_data_cmd(0x06); + send_data_cmd(0x0C); + send_data_cmd(0x10); + send_data_cmd(0x15); + send_data_cmd(0x16); + send_data_cmd(0x14); + send_data_cmd(0x16); + send_data_cmd(0x12); + send_data_cmd(0x18); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x77); //0x77: 24bit, 0x66: 18bit + + /*send_ctrl_cmd(0x2D); //Look up table// + for(i=0;i<64;i++) + send_data_cmd(4*i);//RED + for(i=0;i<64;i++) + send_data_cmd(4*i);//Green + for(i=0;i<64;i++) + send_data_cmd(4*i);//Blue +//set pwm FAE*/ +/* + send_ctrl_cmd(0xC9); + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F); + send_data_cmd(0x06); +*/ + //printk("LCD: PWM Frequency set\n"); + +// send_ctrl_cmd(0x51); +// send_data_cmd(0x00); + + send_ctrl_cmd(0x36); + send_data_cmd(0x00); + +// send_ctrl_cmd(0x53); +// send_data_cmd(0x24); +// send_ctrl_cmd(0x55); +// send_data_cmd(0x01); + send_ctrl_cmd(0x11); + MDELAY(200); + send_ctrl_cmd(0x29); + MDELAY(20); + +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 40; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 5; + params->dpi.hsync_back_porch = 5; + params->dpi.hsync_front_porch = 5; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 5; + params->dpi.vsync_front_porch = 8; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(50); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); + //backlight + backlight_ctrl(1); +} + + +static void lcm_suspend(void) +{ +#if 1 + //backlight + backlight_ctrl(0); + + send_ctrl_cmd(0x10); + MDELAY(100); +#endif +} + + +static void lcm_resume(void) +{ +#if 1 + //send_ctrl_cmd(0x11); + //MDELAY(300); + lcm_init();//LK@sync from 6573 I1800 AUX_V900 + //backlight + backlight_ctrl(1); +#endif + //backlight_ctrl(1); +} + +static void lcm_setbacklight(unsigned int level) +{ + + backlight_ctrl(1); + +} +static unsigned int lcm_compare_id(void) +{ + + + return 1; + +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER dj3065a_hx8369a_lcm_drv = +{ + .name = "dj3065a_hx8369a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/dummy/dummy.c b/acer_e350_simcom75/lcm/dummy/dummy.c new file mode 100644 index 0000000..b1b5673 --- /dev/null +++ b/acer_e350_simcom75/lcm/dummy/dummy.c @@ -0,0 +1,180 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/acer_e350_simcom75/lcm/h40d07_wvga_nt35510/h40d07_wvga_nt35510.c b/acer_e350_simcom75/lcm/h40d07_wvga_nt35510/h40d07_wvga_nt35510.c new file mode 100644 index 0000000..5a43add --- /dev/null +++ b/acer_e350_simcom75/lcm/h40d07_wvga_nt35510/h40d07_wvga_nt35510.c @@ -0,0 +1,545 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +//chenhaojun +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x5510 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_read_data(void) +{ + unsigned int i; + int k=0; + unsigned int getbyte1=0; + unsigned int data=0; + +#ifdef BUILD_UBOOT + printf("spi_read_data \r\n"); +#endif + + data = 0xc0; + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + SET_LA0_INPUT; + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 7)) + { + SET_LSDA_HIGH; + } + else + { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } +#if 0 + for(i=8;i>0;i--) + { + SET_LSCK_LOW; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#endif + UDELAY(5); + for (k = 7; k >=0; k--) + { + SET_LSCK_LOW; + if (GET_LSA0_BIT) + { + getbyte1 |= (1 << k); + } + + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#ifdef BUILD_UBOOT + printf("getbyte1=0x%x \r\n",getbyte1); +#endif + SET_LSDA_HIGH; + SET_LSCE_HIGH; + return getbyte1; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + + +static void init_lcm_registers(void) +{ +#ifdef BUILD_UBOOT + printf("init_lcm_registers\r\n"); +#else + printk("init_lcm_registers\r\n"); +#endif + +/********************************************** +module factory:chaosheng +module id:GWMTF10160A(R) +resolution:480*800(WVGA)-4.0inch +**********************************************/ + //********Sleep out**************** + send_ctrl_cmd(0XFF00); //TEST Commands + send_data_cmd(0XAA); + send_ctrl_cmd(0XFF01); + send_data_cmd(0X55); + send_ctrl_cmd(0XFF02); + send_data_cmd(0X25); + send_ctrl_cmd(0XFF03); + send_data_cmd(0X01); + //************* Start Initial Sequence **********// + send_ctrl_cmd(0xBC00); send_data_cmd(0x00); //VGMP/VGMN/VOOM Setting, VGMP=5.8V #VGSP=0V + send_ctrl_cmd(0xBC01); send_data_cmd(0xA0); + send_ctrl_cmd(0xBC02); send_data_cmd(0x00); + + send_ctrl_cmd(0xBD00); send_data_cmd(0x00); //VGMN=-5.8V #VGSN=0V + send_ctrl_cmd(0xBD01); send_data_cmd(0xA0); + send_ctrl_cmd(0xBD02); send_data_cmd(0x00); + + send_ctrl_cmd(0xBE00); send_data_cmd(0x00); //VCOM= -1V + send_ctrl_cmd(0xBE01); send_data_cmd(0x40); + + send_ctrl_cmd(0xB000); send_data_cmd(0x03); //AVDD, Set AVDD 6.2V + send_ctrl_cmd(0xB001); send_data_cmd(0x03); + send_ctrl_cmd(0xB002); send_data_cmd(0x03); + + send_ctrl_cmd(0xB100); send_data_cmd(0x00); //AVEE voltage, Set AVEE -6.5V + send_ctrl_cmd(0xB101); send_data_cmd(0x00); + send_ctrl_cmd(0xB102); send_data_cmd(0x00); + + send_ctrl_cmd(0xB900); send_data_cmd(0x34); //VGH, Set VGH 18V + send_ctrl_cmd(0xB901); send_data_cmd(0x34); + send_ctrl_cmd(0xB902); send_data_cmd(0x34); + + send_ctrl_cmd(0xBA00); send_data_cmd(0x04); //VGLX, Set VGL -12V + send_ctrl_cmd(0xBA01); send_data_cmd(0x04); + send_ctrl_cmd(0xBA02); send_data_cmd(0x04); + + // ******************** EABLE PAGE 0 **************// + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + + send_ctrl_cmd(0xB400); send_data_cmd(0x10);//Vivid Color + + send_ctrl_cmd(0xB600); send_data_cmd(0x02);//SDT + + send_ctrl_cmd(0xB700); send_data_cmd(0x70);//Set Gate EQ + send_ctrl_cmd(0xB701); send_data_cmd(0x70); + + send_ctrl_cmd(0xB800); send_data_cmd(0x01); //Set Source EQ + send_ctrl_cmd(0xB801); send_data_cmd(0x07); + send_ctrl_cmd(0xB802); send_data_cmd(0x07); + send_ctrl_cmd(0xB803); send_data_cmd(0x07); + + send_ctrl_cmd(0xBC00); send_data_cmd(0x05);//Inversion Control + send_ctrl_cmd(0xBC01); send_data_cmd(0x05); + send_ctrl_cmd(0xBC02); send_data_cmd(0x05); + + send_ctrl_cmd(0xBD00); send_data_cmd(0x01); //Porch Adjust + send_ctrl_cmd(0xBD01); send_data_cmd(0x84); + send_ctrl_cmd(0xBD02); send_data_cmd(0x07); + send_ctrl_cmd(0xBD03); send_data_cmd(0x31); + send_ctrl_cmd(0xBD04); send_data_cmd(0x00); + + send_ctrl_cmd(0xBE00); send_data_cmd(0x01); + send_ctrl_cmd(0xBE01); send_data_cmd(0x84); + send_ctrl_cmd(0xBE02); send_data_cmd(0x07); + send_ctrl_cmd(0xBE03); send_data_cmd(0x31); + send_ctrl_cmd(0xBE04); send_data_cmd(0x00); + + send_ctrl_cmd(0xBF00); send_data_cmd(0x01); + send_ctrl_cmd(0xBF01); send_data_cmd(0x84); + send_ctrl_cmd(0xBF02); send_data_cmd(0x07); + send_ctrl_cmd(0xBF03); send_data_cmd(0x31); + send_ctrl_cmd(0xBF04); send_data_cmd(0x00); + + //******************* ENABLE CMD2 PAGE0 **************// + + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + + send_ctrl_cmd(0xC700); send_data_cmd(0x02); + + send_ctrl_cmd(0xC900); send_data_cmd(0x11); + send_ctrl_cmd(0xC901); send_data_cmd(0x00); + send_ctrl_cmd(0xC902); send_data_cmd(0x00); + send_ctrl_cmd(0xC903); send_data_cmd(0x00); + + send_ctrl_cmd(0x3A00); send_data_cmd(0x77); //Data format 16-Bits + + send_ctrl_cmd(0x3500); send_data_cmd(0x00); //TE ON + + send_ctrl_cmd(0x2100); send_data_cmd(0x00); + + send_ctrl_cmd(0x1100); send_data_cmd(0x00);//StartUp + MDELAY(120); + + send_ctrl_cmd(0x2900); send_data_cmd(0x00); //Display On +} + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 40; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 12; + params->dpi.hsync_back_porch = 8; + params->dpi.hsync_front_porch = 8; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 8; + params->dpi.vsync_front_porch = 8; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + +#ifdef BUILD_UBOOT + printf("lcm_init\r\n"); +#else + printk("lcm_init\r\n"); +#endif + + config_gpio(); + + SET_RESET_PIN(1);//LK@I3000 + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120);//LK@0314,at least 120ms + + init_lcm_registers(); + +} + + +static void lcm_suspend(void) +{ + + + send_ctrl_cmd(0X2800); // + MDELAY(150); + send_ctrl_cmd(0x1000); + MDELAY(150); + +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0X1100); // + MDELAY(150); + send_ctrl_cmd(0X2900); // + MDELAY(150); + + + +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; +//return 1 ;//amy0503 add + #if 1 + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120);//LK@0314,at least 120ms + #endif + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_read_data(); + + id = (id1<<8)|id2; + +#ifdef BUILD_UBOOT + printf("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#else + printk("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#endif + + return (LCM_ID == id)?1:0; + +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER h40d07_nt35510_lcm_drv = +{ + .name = "h40d07_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; + + + diff --git a/acer_e350_simcom75/lcm/ha5266/ha5266.c b/acer_e350_simcom75/lcm/ha5266/ha5266.c new file mode 100644 index 0000000..55e1300 --- /dev/null +++ b/acer_e350_simcom75/lcm/ha5266/ha5266.c @@ -0,0 +1,368 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +/* send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00);*/ +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 7; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 30; + params->dpi.hsync_back_porch = 16; + params->dpi.hsync_front_porch = 210; + params->dpi.vsync_pulse_width = 13; + params->dpi.vsync_back_porch = 10; + params->dpi.vsync_front_porch = 22; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA;; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + // init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +/* send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20);*/ +} + + +static void lcm_resume(void) +{ +/* send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900);*/ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ha5266_lcm_drv = +{ + .name = "ha5266", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/acer_e350_simcom75/lcm/hsd070idw1/hsd070idw1.c b/acer_e350_simcom75/lcm/hsd070idw1/hsd070idw1.c new file mode 100644 index 0000000..dd9afd6 --- /dev/null +++ b/acer_e350_simcom75/lcm/hsd070idw1/hsd070idw1.c @@ -0,0 +1,188 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 8; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 48; + params->dpi.hsync_back_porch = 40; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 29; + params->dpi.vsync_front_porch = 13; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + //program reset pin + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +} + + +static void lcm_suspend(void) +{ +//disable output pixel clk +} + + +static void lcm_resume(void) +{ +//enable output pixel clk +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hsd070idw1_lcm_drv = +{ + .name = "hsd070idw1", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/acer_e350_simcom75/lcm/hx8357B/hx8357b.c b/acer_e350_simcom75/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..44a5389 --- /dev/null +++ b/acer_e350_simcom75/lcm/hx8357B/hx8357b.c @@ -0,0 +1,353 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S + SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/acer_e350_simcom75/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c b/acer_e350_simcom75/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c new file mode 100644 index 0000000..ed06ac5 --- /dev/null +++ b/acer_e350_simcom75/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c @@ -0,0 +1,491 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, +#else//new 20120224 +{0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x0E, 0x0E, 0x21, + 0x29, 0x3F, 0x3F, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 7, {0x02, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x1C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBF, 1, {0x05, 0x60, 0x00, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xE2, 1, {0x01}},//0x01=dynamic,0x00=static + {REGFLAG_DELAY, 10, {}}, + + {0xE5, 1, {0x15}},//0x15 L, 0x16 M, 0x17 H + {REGFLAG_DELAY, 10, {}}, +#endif + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + // SET GAMMA + #if 0 + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x85, 0x89, 0xCC, 0xD1, + 0xD6, 0x15, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x85, 0x89, 0xCC, + 0xD1, 0xD6, 0x15, 0x15, + 0x12, 0x18}}, +#else//new 20120224 +{0xE0, 34, {0x00, 0x06, 0x0A, 0x12, + 0x15, 0x3B, 0x1D, 0x34, + 0x87, 0x8E, 0xCC, 0xCF, + 0xCE, 0x0E, 0x12, 0x11, + 0x18, 0x00, 0x06, 0x0A, + 0x12, 0x15, 0x3B, 0x1D, + 0x34, 0x87, 0x8E, 0xCC, + 0xCF, 0xCE, 0x0E, 0x12, + 0x11, 0x18}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x14}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x00,0X03}},//17.143kHz + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_mode_setting[] = { + {0x55, 1, {0x1}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setbacklight_mode(unsigned int mode) +{ + lcm_backlight_mode_setting[0].para_list[0] = mode; + push_table(lcm_backlight_mode_setting, sizeof(lcm_backlight_mode_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, +#else//new 20120224 +{0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x0E, 0x0E, 0x21, + 0x29, 0x3F, 0x3F, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 7, {0x02, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x1C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBF, 1, {0x05, 0x60, 0x00, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xE2, 1, {0x01}},//0x01=dynamic,0x00=static + {REGFLAG_DELAY, 10, {}}, + + {0xE5, 1, {0x15}},//0x15 L, 0x16 M, 0x17 H + {REGFLAG_DELAY, 10, {}}, +#endif + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + // SET GAMMA + #if 0 + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x85, 0x89, 0xCC, 0xD1, + 0xD6, 0x15, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x85, 0x89, 0xCC, + 0xD1, 0xD6, 0x15, 0x15, + 0x12, 0x18}}, +#else//new 20120224 +{0xE0, 34, {0x00, 0x06, 0x0A, 0x12, + 0x15, 0x3B, 0x1D, 0x34, + 0x87, 0x8E, 0xCC, 0xCF, + 0xCE, 0x0E, 0x12, 0x11, + 0x18, 0x00, 0x06, 0x0A, + 0x12, 0x15, 0x3B, 0x1D, + 0x34, 0x87, 0x8E, 0xCC, + 0xCF, 0xCE, 0x0E, 0x12, + 0x11, 0x18}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x14}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x00,0X03}},//17.143kHz + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_mode_setting[] = { + {0x55, 1, {0x1}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setbacklight_mode(unsigned int mode) +{ + lcm_backlight_mode_setting[0].para_list[0] = mode; + push_table(lcm_backlight_mode_setting, sizeof(lcm_backlight_mode_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0xff);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x02);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + sw_clear_panel(0); + send_ctrl_cmd(0x10); + MDELAY(5); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + send_ctrl_cmd(0xC3); + send_data_cmd(0xFF); + + send_ctrl_cmd(0xF4); + read_data_cmd(); + return (LCM_ID == read_data_cmd())?1:0; +} + +LCM_DRIVER hx8369_6575_lcm_drv = +{ + .name = "hx8369_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id, +}; + + diff --git a/acer_e350_simcom75/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c b/acer_e350_simcom75/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c new file mode 100644 index 0000000..3d141a9 --- /dev/null +++ b/acer_e350_simcom75/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c @@ -0,0 +1,547 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, ///apply it as ESD indication + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[2]; + unsigned int array[16]; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + read_reg_v2(0xF4, buffer, 2); + id = buffer[0]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hx8369_dsi_6575_lcm_drv = +{ + .name = "hx8369_dsi_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + .set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + .esd_check = lcm_esd_check, + .esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/acer_e350_simcom75/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c b/acer_e350_simcom75/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c new file mode 100644 index 0000000..7a1cd45 --- /dev/null +++ b/acer_e350_simcom75/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c @@ -0,0 +1,462 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include ///for printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include ///for printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 5, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 5, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 5, {}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 5, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.vertical_sync_active = 3; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +/* // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING;*/ +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // AUO 3.17" + ILI9481 + + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); + send_data_cmd(0X0007); + send_data_cmd(0X0041); + send_data_cmd(0X001B); + + send_ctrl_cmd(0X00D1); + send_data_cmd(0X0000); + send_data_cmd(0X0016); // 0x001b + send_data_cmd(0X0012); + + send_ctrl_cmd(0X00D2); + send_data_cmd(0X0001); + send_data_cmd(0X0011); + + send_ctrl_cmd(0X00C0); + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X00F3); + send_data_cmd(0X0040); + send_data_cmd(0X000A); + send_ctrl_cmd(0X00F6); + send_data_cmd(0X0080); + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0080); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x29); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, +}; diff --git a/acer_e350_simcom75/lcm/inc/lcm_drv.h b/acer_e350_simcom75/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..cd5c815 --- /dev/null +++ b/acer_e350_simcom75/lcm/inc/lcm_drv.h @@ -0,0 +1,563 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), + LCM_DRIVING_CURRENT_6575_4MA = (1 << 4), + LCM_DRIVING_CURRENT_6575_8MA = (3 << 4), + LCM_DRIVING_CURRENT_6575_12MA = (2 << 4), + LCM_DRIVING_CURRENT_6575_16MA = (4 << 4) +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4, + LCM_DBI_DATA_WIDTH_32BITS = 5 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; + + +/* DSI related enumerations */ + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_DSI_FORMAT_RGB565 = 0, + LCM_DSI_FORMAT_RGB666 = 1, + LCM_DSI_FORMAT_RGB888 = 2 +} LCM_DSI_FORMAT; + + +typedef enum +{ + LCM_DSI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DSI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DSI_TRANS_SEQ; + + +typedef enum +{ + LCM_DSI_PADDING_ON_LSB = 0, + LCM_DSI_PADDING_ON_MSB = 1 +} LCM_DSI_PADDING; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +////////////////////////////////////MT6575 added params, and if lcm driver is for 6575, only care these below params + unsigned int css; + unsigned int csh; + unsigned int rd_1st; + unsigned int rd_2nd; + unsigned int wr_1st; + unsigned int wr_2nd; + + unsigned int sif_3wire; + unsigned int sif_sdi; + LCM_POLARITY sif_1st_pol; + LCM_POLARITY sif_sck_def; + unsigned int sif_div2; + unsigned int sif_hw_cs; +//////////////////////////////////// +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_hold; + unsigned int read_latency; + unsigned int wait_period; + /*only for 6575*/ + unsigned int cs_high_width; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DSI_TRANS_SEQ trans_seq; + LCM_DSI_PADDING padding; + LCM_DSI_FORMAT format; +} LCM_DSI_DATA_FORMAT; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + unsigned int i2x_en; + unsigned int i2x_edge; + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + + LCM_LANE_NUM LANE_NUM; + LCM_DSI_DATA_FORMAT data_format; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int packet_size; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int horizontal_sync_active; + unsigned int horizontal_backporch; + unsigned int horizontal_frontporch; + unsigned int horizontal_active_pixel; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq_V2)(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update); + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + unsigned int (*dsi_dcs_read_lcm_reg)(unsigned char cmd); + unsigned int (*dsi_dcs_read_lcm_reg_v2)(unsigned char cmd, unsigned char *buffer, unsigned char buffer_size); + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned char pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); +///////////////////////////CABC backlight related function + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + void (*set_backlight_mode)(unsigned int mode); +/////////////////////////// + +/////////////ESD_RECOVERY////////////////////// + unsigned int (*esd_check)(void); + unsigned int (*esd_recover)(void); + +///////////////////////////////////////////////// + +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/acer_e350_simcom75/lcm/ips3p2620_qhd_nt35516/ips3p2620_qhd_nt35516.c b/acer_e350_simcom75/lcm/ips3p2620_qhd_nt35516/ips3p2620_qhd_nt35516.c new file mode 100644 index 0000000..ef0bead --- /dev/null +++ b/acer_e350_simcom75/lcm/ips3p2620_qhd_nt35516/ips3p2620_qhd_nt35516.c @@ -0,0 +1,2131 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + + +/*Extern func*/ +#if defined(ACER_C8) +/*punk add for tp*/ +extern void fts_chk_chr(void); +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + + +#ifdef BUILD_UBOOT +#define LCD_PRINT printf +#else +#define LCD_PRINT printk +#endif + + +//#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#if 0 +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#else +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) +#endif +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + + +#define PARA_MAX 40 +struct init_para_st +{ + unsigned short reg_start; + unsigned short para_cnt; + unsigned char parameters[PARA_MAX]; +}; + +static struct init_para_st init_setting[] = +{ + { + 0xff00,5, + { + 0xaa,0x55,0x25,0x01,0x01, + } + }, + { + 0xF200,35, + { + 0x00, 0x00, 0x4A, 0x0A, 0xA8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x51, 0x00, + 0x01, 0x00, 0x01, + } + }, + { + 0xF300,7, + { + 0x02, 0x03, 0x07, 0x45, 0x88, 0xD1, 0x0D, + } + }, + { + 0xF000,5, + { + 0x55, 0xAA, 0x52, 0x08, 0x00 + } + }, + { + 0xB100,3, + { + 0xCC, 0x00, 0x00, + } + }, + { + 0xB800,4, + { + 0x01, 0x02, 0x02, 0x02, + } + }, + { + 0xC900,6, + { + 0x63, 0x06, 0x0D, 0x1A, 0x17, 0x00, + } + }, + { + 0xF000,5, + { + 0x55, 0xAA, 0x52, 0x08, 0x01, + } + }, + { + 0xB000,3, + { + 0x05, 0x05, 0x05, + } + }, + { + 0xB100,3, + { + 0x05, 0x05, 0x05, + } + }, + { + 0xB200,3, + { + 0x01, 0x01, 0x01, + } + }, + { + 0xB300,3, + { + 0x0E, 0x0E, 0x0E, + } + }, + { + 0xB400,3, + { + 0x08, 0x08, 0x08, + } + }, + { + 0xB600,3, + { + 0x44, 0x44, 0x44, + } + }, + { + 0xB700,3, + { + 0x34, 0x34, 0x34, + } + }, + { + 0xB800,3, + { + 0x10, 0x10, 0x10, + } + }, + { + 0xB900,3, + { + 0x26, 0x26, 0x26, + } + }, + { + 0xBA00,3, + { + 0x34, 0x34, 0x34, + } + }, + { + 0xBC00,3, + { + 0x00, 0xC8, 0x00, + } + }, + { + 0xBD00,3, + { + 0x00, 0xC8, 0x00, + } + }, + { + 0xBE00,1, + { + 0x79,/*punk, 0x92->0x79*/ + } + }, + { + 0xC000,2, + { + 0x04, 0x00, + } + }, + { + 0xCA00,1, + { + 0x00, + } + }, + { + 0xD000,4, + { + 0x0A, 0x10, 0x0D, 0x0F, + } + }, + { + 0xD100,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xD200,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xD300,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xD400,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xD500,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xD600,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xD700,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xD800,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xD900,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xDD00,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xDE00,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xDF00,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE000,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE100,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xE200,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xE300,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE400,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE500,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xE600,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xE700,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE800,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE900,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xEA00,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xEB00,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + } +}; + + +static int init_setting_num = sizeof(init_setting)/sizeof(init_setting[0]); + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + //unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + int i,k; + +#if 0 + xx + LCD_PRINT("punk,init_lcm_registers -1 truly code\n"); + send_ctrl_cmd(0xFF00); send_data_cmd(0xAA); + send_ctrl_cmd(0xFF01); send_data_cmd(0x55); + send_ctrl_cmd(0xFF02); send_data_cmd(0x25); + send_ctrl_cmd(0xFF03); send_data_cmd(0x01); + send_ctrl_cmd(0xFF04); send_data_cmd(0x01); + + send_ctrl_cmd(0xF200); send_data_cmd(0x00); + send_ctrl_cmd(0xF201); send_data_cmd(0x00); + send_ctrl_cmd(0xF202); send_data_cmd(0x4A); + send_ctrl_cmd(0xF203); send_data_cmd(0x0A); + send_ctrl_cmd(0xF204); send_data_cmd(0xA8); + send_ctrl_cmd(0xF205); send_data_cmd(0x00); + send_ctrl_cmd(0xF206); send_data_cmd(0x00); + send_ctrl_cmd(0xF207); send_data_cmd(0x00); + send_ctrl_cmd(0xF208); send_data_cmd(0x00); + send_ctrl_cmd(0xF209); send_data_cmd(0x00); + send_ctrl_cmd(0xF210); send_data_cmd(0x00); + send_ctrl_cmd(0xF211); send_data_cmd(0x00); + send_ctrl_cmd(0xF212); send_data_cmd(0x00); + send_ctrl_cmd(0xF213); send_data_cmd(0x00); + send_ctrl_cmd(0xF214); send_data_cmd(0x00); + send_ctrl_cmd(0xF215); send_data_cmd(0x00); + send_ctrl_cmd(0xF216); send_data_cmd(0x00); + send_ctrl_cmd(0xF217); send_data_cmd(0x0B); + send_ctrl_cmd(0xF218); send_data_cmd(0x00); + send_ctrl_cmd(0xF219); send_data_cmd(0x00); + send_ctrl_cmd(0xF220); send_data_cmd(0x00); + send_ctrl_cmd(0xF221); send_data_cmd(0x00); + send_ctrl_cmd(0xF222); send_data_cmd(0x00); + send_ctrl_cmd(0xF223); send_data_cmd(0x00); + send_ctrl_cmd(0xF224); send_data_cmd(0x00); + send_ctrl_cmd(0xF225); send_data_cmd(0x00); + send_ctrl_cmd(0xF226); send_data_cmd(0x00); + send_ctrl_cmd(0xF227); send_data_cmd(0x00); + send_ctrl_cmd(0xF228); send_data_cmd(0x40); + send_ctrl_cmd(0xF229); send_data_cmd(0x01); + send_ctrl_cmd(0xF230); send_data_cmd(0x51); + send_ctrl_cmd(0xF231); send_data_cmd(0x00); + send_ctrl_cmd(0xF232); send_data_cmd(0x01); + send_ctrl_cmd(0xF233); send_data_cmd(0x00); + send_ctrl_cmd(0xF234); send_data_cmd(0x01); + + send_ctrl_cmd(0xF300); send_data_cmd(0x02); + send_ctrl_cmd(0xF301); send_data_cmd(0x03); + send_ctrl_cmd(0xF302); send_data_cmd(0x07); + send_ctrl_cmd(0xF303); send_data_cmd(0x45); + send_ctrl_cmd(0xF304); send_data_cmd(0x88); + send_ctrl_cmd(0xF305); send_data_cmd(0xD1); + send_ctrl_cmd(0xF306); send_data_cmd(0x0D); + + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + + send_ctrl_cmd(0xB100); send_data_cmd(0xCC); + send_ctrl_cmd(0xB101); send_data_cmd(0x00); + send_ctrl_cmd(0xB102); send_data_cmd(0x00); + + send_ctrl_cmd(0xB800); send_data_cmd(0x01); + send_ctrl_cmd(0xB801); send_data_cmd(0x02); + send_ctrl_cmd(0xB802); send_data_cmd(0x02); + send_ctrl_cmd(0xB803); send_data_cmd(0x02); + + send_ctrl_cmd(0xC900); send_data_cmd(0x63); + send_ctrl_cmd(0xC901); send_data_cmd(0x06); + send_ctrl_cmd(0xC902); send_data_cmd(0x0D); + send_ctrl_cmd(0xC903); send_data_cmd(0x1A); + send_ctrl_cmd(0xC904); send_data_cmd(0x17); + send_ctrl_cmd(0xC905); send_data_cmd(0x00); + + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x01); + + send_ctrl_cmd(0xB000); send_data_cmd(0x05); + send_ctrl_cmd(0xB001); send_data_cmd(0x05); + send_ctrl_cmd(0xB002); send_data_cmd(0x05); + + send_ctrl_cmd(0xB100); send_data_cmd(0x05); + send_ctrl_cmd(0xB101); send_data_cmd(0x05); + send_ctrl_cmd(0xB102); send_data_cmd(0x05); + + send_ctrl_cmd(0xB200); send_data_cmd(0x01); + send_ctrl_cmd(0xB201); send_data_cmd(0x01); + send_ctrl_cmd(0xB202); send_data_cmd(0x01); + + send_ctrl_cmd(0xB300); send_data_cmd(0x0E); + send_ctrl_cmd(0xB301); send_data_cmd(0x0E); + send_ctrl_cmd(0xB302); send_data_cmd(0x0E); + + send_ctrl_cmd(0xB400); send_data_cmd(0x08); + send_ctrl_cmd(0xB401); send_data_cmd(0x08); + send_ctrl_cmd(0xB402); send_data_cmd(0x08); + + send_ctrl_cmd(0xB600); send_data_cmd(0x44); + send_ctrl_cmd(0xB601); send_data_cmd(0x44); + send_ctrl_cmd(0xB602); send_data_cmd(0x44); + + send_ctrl_cmd(0xB700); send_data_cmd(0x34); + send_ctrl_cmd(0xB701); send_data_cmd(0x34); + send_ctrl_cmd(0xB702); send_data_cmd(0x34); + + send_ctrl_cmd(0xB800); send_data_cmd(0x10); + send_ctrl_cmd(0xB801); send_data_cmd(0x10); + send_ctrl_cmd(0xB802); send_data_cmd(0x10); + + send_ctrl_cmd(0xB900); send_data_cmd(0x26); + send_ctrl_cmd(0xB901); send_data_cmd(0x26); + send_ctrl_cmd(0xB902); send_data_cmd(0x26); + + send_ctrl_cmd(0xBA00); send_data_cmd(0x34); + send_ctrl_cmd(0xBA01); send_data_cmd(0x34); + send_ctrl_cmd(0xBA02); send_data_cmd(0x34); + + send_ctrl_cmd(0xBC00); send_data_cmd(0x00); + send_ctrl_cmd(0xBC01); send_data_cmd(0xC8); + send_ctrl_cmd(0xBC02); send_data_cmd(0x00); + + send_ctrl_cmd(0xBD00); send_data_cmd(0x00); + send_ctrl_cmd(0xBD01); send_data_cmd(0xC8); + send_ctrl_cmd(0xBD02); send_data_cmd(0x00); + + send_ctrl_cmd(0xBE00); send_data_cmd(0x87);//punk 0x92->0x87 + + send_ctrl_cmd(0xC000); send_data_cmd(0x04); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + + send_ctrl_cmd(0xCA00); send_data_cmd(0x00); + + send_ctrl_cmd(0xD000); send_data_cmd(0x0A); + send_ctrl_cmd(0xD001); send_data_cmd(0x10); + send_ctrl_cmd(0xD002); send_data_cmd(0x0D); + send_ctrl_cmd(0xD003); send_data_cmd(0x0F); + + send_ctrl_cmd(0xD100); send_data_cmd(0x00); + send_ctrl_cmd(0xD101); send_data_cmd(0x70); + send_ctrl_cmd(0xD102); send_data_cmd(0x00); + send_ctrl_cmd(0xD103); send_data_cmd(0xCE); + send_ctrl_cmd(0xD104); send_data_cmd(0x00); + send_ctrl_cmd(0xD105); send_data_cmd(0xF7); + send_ctrl_cmd(0xD106); send_data_cmd(0x01); + send_ctrl_cmd(0xD107); send_data_cmd(0x10); + send_ctrl_cmd(0xD108); send_data_cmd(0x01); + send_ctrl_cmd(0xD109); send_data_cmd(0x21); + send_ctrl_cmd(0xD110); send_data_cmd(0x01); + send_ctrl_cmd(0xD111); send_data_cmd(0x44); + send_ctrl_cmd(0xD112); send_data_cmd(0x01); + send_ctrl_cmd(0xD113); send_data_cmd(0x62); + send_ctrl_cmd(0xD114); send_data_cmd(0x01); + send_ctrl_cmd(0xD115); send_data_cmd(0x8D); + + send_ctrl_cmd(0xD200); send_data_cmd(0x01); + send_ctrl_cmd(0xD201); send_data_cmd(0xAF); + send_ctrl_cmd(0xD202); send_data_cmd(0x01); + send_ctrl_cmd(0xD203); send_data_cmd(0xE4); + send_ctrl_cmd(0xD204); send_data_cmd(0x02); + send_ctrl_cmd(0xD205); send_data_cmd(0x0C); + send_ctrl_cmd(0xD206); send_data_cmd(0x02); + send_ctrl_cmd(0xD207); send_data_cmd(0x4D); + send_ctrl_cmd(0xD208); send_data_cmd(0x02); + send_ctrl_cmd(0xD209); send_data_cmd(0x82); + send_ctrl_cmd(0xD210); send_data_cmd(0x02); + send_ctrl_cmd(0xD211); send_data_cmd(0x84); + send_ctrl_cmd(0xD212); send_data_cmd(0x02); + send_ctrl_cmd(0xD213); send_data_cmd(0xB8); + send_ctrl_cmd(0xD214); send_data_cmd(0x02); + send_ctrl_cmd(0xD215); send_data_cmd(0xF0); + + send_ctrl_cmd(0xD300); send_data_cmd(0x03); + send_ctrl_cmd(0xD301); send_data_cmd(0x14); + send_ctrl_cmd(0xD302); send_data_cmd(0x03); + send_ctrl_cmd(0xD303); send_data_cmd(0x42); + send_ctrl_cmd(0xD304); send_data_cmd(0x03); + send_ctrl_cmd(0xD305); send_data_cmd(0x5E); + send_ctrl_cmd(0xD306); send_data_cmd(0x03); + send_ctrl_cmd(0xD307); send_data_cmd(0x80); + send_ctrl_cmd(0xD308); send_data_cmd(0x03); + send_ctrl_cmd(0xD309); send_data_cmd(0x97); + send_ctrl_cmd(0xD310); send_data_cmd(0x03); + send_ctrl_cmd(0xD311); send_data_cmd(0xB0); + send_ctrl_cmd(0xD312); send_data_cmd(0x03); + send_ctrl_cmd(0xD313); send_data_cmd(0xC0); + send_ctrl_cmd(0xD314); send_data_cmd(0x03); + send_ctrl_cmd(0xD315); send_data_cmd(0xDF); + + send_ctrl_cmd(0xD400); send_data_cmd(0x03); + send_ctrl_cmd(0xD401); send_data_cmd(0xFD); + send_ctrl_cmd(0xD402); send_data_cmd(0x03); + send_ctrl_cmd(0xD403); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD500); send_data_cmd(0x00); + send_ctrl_cmd(0xD501); send_data_cmd(0x70); + send_ctrl_cmd(0xD502); send_data_cmd(0x00); + send_ctrl_cmd(0xD503); send_data_cmd(0xCE); + send_ctrl_cmd(0xD504); send_data_cmd(0x00); + send_ctrl_cmd(0xD505); send_data_cmd(0xF7); + send_ctrl_cmd(0xD506); send_data_cmd(0x01); + send_ctrl_cmd(0xD507); send_data_cmd(0x10); + send_ctrl_cmd(0xD508); send_data_cmd(0x01); + send_ctrl_cmd(0xD509); send_data_cmd(0x21); + send_ctrl_cmd(0xD510); send_data_cmd(0x01); + send_ctrl_cmd(0xD511); send_data_cmd(0x44); + send_ctrl_cmd(0xD512); send_data_cmd(0x01); + send_ctrl_cmd(0xD513); send_data_cmd(0x62); + send_ctrl_cmd(0xD514); send_data_cmd(0x01); + send_ctrl_cmd(0xD515); send_data_cmd(0x8D); + + send_ctrl_cmd(0xD600); send_data_cmd(0x01); + send_ctrl_cmd(0xD601); send_data_cmd(0xAF); + send_ctrl_cmd(0xD602); send_data_cmd(0x01); + send_ctrl_cmd(0xD603); send_data_cmd(0xE4); + send_ctrl_cmd(0xD604); send_data_cmd(0x02); + send_ctrl_cmd(0xD605); send_data_cmd(0x0C); + send_ctrl_cmd(0xD606); send_data_cmd(0x02); + send_ctrl_cmd(0xD607); send_data_cmd(0x4D); + send_ctrl_cmd(0xD608); send_data_cmd(0x02); + send_ctrl_cmd(0xD609); send_data_cmd(0x82); + send_ctrl_cmd(0xD610); send_data_cmd(0x02); + send_ctrl_cmd(0xD611); send_data_cmd(0x84); + send_ctrl_cmd(0xD612); send_data_cmd(0x02); + send_ctrl_cmd(0xD613); send_data_cmd(0xB8); + send_ctrl_cmd(0xD614); send_data_cmd(0x02); + send_ctrl_cmd(0xD615); send_data_cmd(0xF0); + + send_ctrl_cmd(0xD700); send_data_cmd(0x03); + send_ctrl_cmd(0xD701); send_data_cmd(0x14); + send_ctrl_cmd(0xD702); send_data_cmd(0x03); + send_ctrl_cmd(0xD703); send_data_cmd(0x42); + send_ctrl_cmd(0xD704); send_data_cmd(0x03); + send_ctrl_cmd(0xD705); send_data_cmd(0x5E); + send_ctrl_cmd(0xD706); send_data_cmd(0x03); + send_ctrl_cmd(0xD707); send_data_cmd(0x80); + send_ctrl_cmd(0xD708); send_data_cmd(0x03); + send_ctrl_cmd(0xD709); send_data_cmd(0x97); + send_ctrl_cmd(0xD710); send_data_cmd(0x03); + send_ctrl_cmd(0xD711); send_data_cmd(0xB0); + send_ctrl_cmd(0xD712); send_data_cmd(0x03); + send_ctrl_cmd(0xD713); send_data_cmd(0xC0); + send_ctrl_cmd(0xD714); send_data_cmd(0x03); + send_ctrl_cmd(0xD715); send_data_cmd(0xDF); + + send_ctrl_cmd(0xD800); send_data_cmd(0x03); + send_ctrl_cmd(0xD801); send_data_cmd(0xFD); + send_ctrl_cmd(0xD802); send_data_cmd(0x03); + send_ctrl_cmd(0xD803); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD900); send_data_cmd(0x00); + send_ctrl_cmd(0xD901); send_data_cmd(0x70); + send_ctrl_cmd(0xD902); send_data_cmd(0x00); + send_ctrl_cmd(0xD903); send_data_cmd(0xCE); + send_ctrl_cmd(0xD904); send_data_cmd(0x00); + send_ctrl_cmd(0xD905); send_data_cmd(0xF7); + send_ctrl_cmd(0xD906); send_data_cmd(0x01); + send_ctrl_cmd(0xD907); send_data_cmd(0x10); + send_ctrl_cmd(0xD908); send_data_cmd(0x01); + send_ctrl_cmd(0xD909); send_data_cmd(0x21); + send_ctrl_cmd(0xD910); send_data_cmd(0x01); + send_ctrl_cmd(0xD911); send_data_cmd(0x44); + send_ctrl_cmd(0xD912); send_data_cmd(0x01); + send_ctrl_cmd(0xD913); send_data_cmd(0x62); + send_ctrl_cmd(0xD914); send_data_cmd(0x01); + send_ctrl_cmd(0xD915); send_data_cmd(0x8D); + + send_ctrl_cmd(0xDD00); send_data_cmd(0x01); + send_ctrl_cmd(0xDD01); send_data_cmd(0xAF); + send_ctrl_cmd(0xDD02); send_data_cmd(0x01); + send_ctrl_cmd(0xDD03); send_data_cmd(0xE4); + send_ctrl_cmd(0xDD04); send_data_cmd(0x02); + send_ctrl_cmd(0xDD05); send_data_cmd(0x0C); + send_ctrl_cmd(0xDD06); send_data_cmd(0x02); + send_ctrl_cmd(0xDD07); send_data_cmd(0x4D); + send_ctrl_cmd(0xDD08); send_data_cmd(0x02); + send_ctrl_cmd(0xDD09); send_data_cmd(0x82); + send_ctrl_cmd(0xDD10); send_data_cmd(0x02); + send_ctrl_cmd(0xDD11); send_data_cmd(0x84); + send_ctrl_cmd(0xDD12); send_data_cmd(0x02); + send_ctrl_cmd(0xDD13); send_data_cmd(0xB8); + send_ctrl_cmd(0xDD14); send_data_cmd(0x02); + send_ctrl_cmd(0xDD15); send_data_cmd(0xF0); + + send_ctrl_cmd(0xDE00); send_data_cmd(0x03); + send_ctrl_cmd(0xDE01); send_data_cmd(0x14); + send_ctrl_cmd(0xDE02); send_data_cmd(0x03); + send_ctrl_cmd(0xDE03); send_data_cmd(0x42); + send_ctrl_cmd(0xDE04); send_data_cmd(0x03); + send_ctrl_cmd(0xDE05); send_data_cmd(0x5E); + send_ctrl_cmd(0xDE06); send_data_cmd(0x03); + send_ctrl_cmd(0xDE07); send_data_cmd(0x80); + send_ctrl_cmd(0xDE08); send_data_cmd(0x03); + send_ctrl_cmd(0xDE09); send_data_cmd(0x97); + send_ctrl_cmd(0xDE10); send_data_cmd(0x03); + send_ctrl_cmd(0xDE11); send_data_cmd(0xB0); + send_ctrl_cmd(0xDE12); send_data_cmd(0x03); + send_ctrl_cmd(0xDE13); send_data_cmd(0xC0); + send_ctrl_cmd(0xDE14); send_data_cmd(0x03); + send_ctrl_cmd(0xDE15); send_data_cmd(0xDF); + + send_ctrl_cmd(0xDF00); send_data_cmd(0x03); + send_ctrl_cmd(0xDF01); send_data_cmd(0xFD); + send_ctrl_cmd(0xDF02); send_data_cmd(0x03); + send_ctrl_cmd(0xDF03); send_data_cmd(0xFF); + + send_ctrl_cmd(0xE000); send_data_cmd(0x00); + send_ctrl_cmd(0xE001); send_data_cmd(0x70); + send_ctrl_cmd(0xE002); send_data_cmd(0x00); + send_ctrl_cmd(0xE003); send_data_cmd(0xCE); + send_ctrl_cmd(0xE004); send_data_cmd(0x00); + send_ctrl_cmd(0xE005); send_data_cmd(0xF7); + send_ctrl_cmd(0xE006); send_data_cmd(0x01); + send_ctrl_cmd(0xE007); send_data_cmd(0x10); + send_ctrl_cmd(0xE008); send_data_cmd(0x01); + send_ctrl_cmd(0xE009); send_data_cmd(0x21); + send_ctrl_cmd(0xE010); send_data_cmd(0x01); + send_ctrl_cmd(0xE011); send_data_cmd(0x44); + send_ctrl_cmd(0xE012); send_data_cmd(0x01); + send_ctrl_cmd(0xE013); send_data_cmd(0x62); + send_ctrl_cmd(0xE014); send_data_cmd(0x01); + send_ctrl_cmd(0xE015); send_data_cmd(0x8D); + + send_ctrl_cmd(0xE100); send_data_cmd(0x01); + send_ctrl_cmd(0xE101); send_data_cmd(0xAF); + send_ctrl_cmd(0xE102); send_data_cmd(0x01); + send_ctrl_cmd(0xE103); send_data_cmd(0xE4); + send_ctrl_cmd(0xE104); send_data_cmd(0x02); + send_ctrl_cmd(0xE105); send_data_cmd(0x0C); + send_ctrl_cmd(0xE106); send_data_cmd(0x02); + send_ctrl_cmd(0xE107); send_data_cmd(0x4D); + send_ctrl_cmd(0xE108); send_data_cmd(0x02); + send_ctrl_cmd(0xE109); send_data_cmd(0x82); + send_ctrl_cmd(0xE110); send_data_cmd(0x02); + send_ctrl_cmd(0xE111); send_data_cmd(0x84); + send_ctrl_cmd(0xE112); send_data_cmd(0x02); + send_ctrl_cmd(0xE113); send_data_cmd(0xB8); + send_ctrl_cmd(0xE114); send_data_cmd(0x02); + send_ctrl_cmd(0xE115); send_data_cmd(0xF0); + + send_ctrl_cmd(0xE200); send_data_cmd(0x03); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x03); + send_ctrl_cmd(0xE203); send_data_cmd(0x42); + send_ctrl_cmd(0xE204); send_data_cmd(0x03); + send_ctrl_cmd(0xE205); send_data_cmd(0x5E); + send_ctrl_cmd(0xE206); send_data_cmd(0x03); + send_ctrl_cmd(0xE207); send_data_cmd(0x80); + send_ctrl_cmd(0xE208); send_data_cmd(0x03); + send_ctrl_cmd(0xE209); send_data_cmd(0x97); + send_ctrl_cmd(0xE210); send_data_cmd(0x03); + send_ctrl_cmd(0xE211); send_data_cmd(0xB0); + send_ctrl_cmd(0xE212); send_data_cmd(0x03); + send_ctrl_cmd(0xE213); send_data_cmd(0xC0); + send_ctrl_cmd(0xE214); send_data_cmd(0x03); + send_ctrl_cmd(0xE215); send_data_cmd(0xDF); + + send_ctrl_cmd(0xE300); send_data_cmd(0x03); + send_ctrl_cmd(0xE301); send_data_cmd(0xFD); + send_ctrl_cmd(0xE302); send_data_cmd(0x03); + send_ctrl_cmd(0xE303); send_data_cmd(0xFF); + + send_ctrl_cmd(0xE400); send_data_cmd(0x00); + send_ctrl_cmd(0xE401); send_data_cmd(0x70); + send_ctrl_cmd(0xE402); send_data_cmd(0x00); + send_ctrl_cmd(0xE403); send_data_cmd(0xCE); + send_ctrl_cmd(0xE404); send_data_cmd(0x00); + send_ctrl_cmd(0xE405); send_data_cmd(0xF7); + send_ctrl_cmd(0xE406); send_data_cmd(0x01); + send_ctrl_cmd(0xE407); send_data_cmd(0x10); + send_ctrl_cmd(0xE408); send_data_cmd(0x01); + send_ctrl_cmd(0xE409); send_data_cmd(0x21); + send_ctrl_cmd(0xE410); send_data_cmd(0x01); + send_ctrl_cmd(0xE411); send_data_cmd(0x44); + send_ctrl_cmd(0xE412); send_data_cmd(0x01); + send_ctrl_cmd(0xE413); send_data_cmd(0x62); + send_ctrl_cmd(0xE414); send_data_cmd(0x01); + send_ctrl_cmd(0xE415); send_data_cmd(0x8D); + + send_ctrl_cmd(0xE500); send_data_cmd(0x01); + send_ctrl_cmd(0xE501); send_data_cmd(0xAF); + send_ctrl_cmd(0xE502); send_data_cmd(0x01); + send_ctrl_cmd(0xE503); send_data_cmd(0xE4); + send_ctrl_cmd(0xE504); send_data_cmd(0x02); + send_ctrl_cmd(0xE505); send_data_cmd(0x0C); + send_ctrl_cmd(0xE506); send_data_cmd(0x02); + send_ctrl_cmd(0xE507); send_data_cmd(0x4D); + send_ctrl_cmd(0xE508); send_data_cmd(0x02); + send_ctrl_cmd(0xE509); send_data_cmd(0x82); + send_ctrl_cmd(0xE510); send_data_cmd(0x02); + send_ctrl_cmd(0xE511); send_data_cmd(0x84); + send_ctrl_cmd(0xE512); send_data_cmd(0x02); + send_ctrl_cmd(0xE513); send_data_cmd(0xB8); + send_ctrl_cmd(0xE514); send_data_cmd(0x02); + send_ctrl_cmd(0xE515); send_data_cmd(0xF0); + + send_ctrl_cmd(0xE600); send_data_cmd(0x03); + send_ctrl_cmd(0xE601); send_data_cmd(0x14); + send_ctrl_cmd(0xE602); send_data_cmd(0x03); + send_ctrl_cmd(0xE603); send_data_cmd(0x42); + send_ctrl_cmd(0xE604); send_data_cmd(0x03); + send_ctrl_cmd(0xE605); send_data_cmd(0x5E); + send_ctrl_cmd(0xE606); send_data_cmd(0x03); + send_ctrl_cmd(0xE607); send_data_cmd(0x80); + send_ctrl_cmd(0xE608); send_data_cmd(0x03); + send_ctrl_cmd(0xE609); send_data_cmd(0x97); + send_ctrl_cmd(0xE610); send_data_cmd(0x03); + send_ctrl_cmd(0xE611); send_data_cmd(0xB0); + send_ctrl_cmd(0xE612); send_data_cmd(0x03); + send_ctrl_cmd(0xE613); send_data_cmd(0xC0); + send_ctrl_cmd(0xE614); send_data_cmd(0x03); + send_ctrl_cmd(0xE615); send_data_cmd(0xDF); + + send_ctrl_cmd(0xE700); send_data_cmd(0x03); + send_ctrl_cmd(0xE701); send_data_cmd(0xFD); + send_ctrl_cmd(0xE702); send_data_cmd(0x03); + send_ctrl_cmd(0xE703); send_data_cmd(0xFF); + + send_ctrl_cmd(0xE800); send_data_cmd(0x00); + send_ctrl_cmd(0xE801); send_data_cmd(0x70); + send_ctrl_cmd(0xE802); send_data_cmd(0x00); + send_ctrl_cmd(0xE803); send_data_cmd(0xCE); + send_ctrl_cmd(0xE804); send_data_cmd(0x00); + send_ctrl_cmd(0xE805); send_data_cmd(0xF7); + send_ctrl_cmd(0xE806); send_data_cmd(0x01); + send_ctrl_cmd(0xE807); send_data_cmd(0x10); + send_ctrl_cmd(0xE808); send_data_cmd(0x01); + send_ctrl_cmd(0xE809); send_data_cmd(0x21); + send_ctrl_cmd(0xE810); send_data_cmd(0x01); + send_ctrl_cmd(0xE811); send_data_cmd(0x44); + send_ctrl_cmd(0xE812); send_data_cmd(0x01); + send_ctrl_cmd(0xE813); send_data_cmd(0x62); + send_ctrl_cmd(0xE814); send_data_cmd(0x01); + send_ctrl_cmd(0xE815); send_data_cmd(0x8D); + + send_ctrl_cmd(0xE900); send_data_cmd(0x01); + send_ctrl_cmd(0xE901); send_data_cmd(0xAF); + send_ctrl_cmd(0xE902); send_data_cmd(0x01); + send_ctrl_cmd(0xE903); send_data_cmd(0xE4); + send_ctrl_cmd(0xE904); send_data_cmd(0x02); + send_ctrl_cmd(0xE905); send_data_cmd(0x0C); + send_ctrl_cmd(0xE906); send_data_cmd(0x02); + send_ctrl_cmd(0xE907); send_data_cmd(0x4D); + send_ctrl_cmd(0xE908); send_data_cmd(0x02); + send_ctrl_cmd(0xE909); send_data_cmd(0x82); + send_ctrl_cmd(0xE910); send_data_cmd(0x02); + send_ctrl_cmd(0xE911); send_data_cmd(0x84); + send_ctrl_cmd(0xE912); send_data_cmd(0x02); + send_ctrl_cmd(0xE913); send_data_cmd(0xB8); + send_ctrl_cmd(0xE914); send_data_cmd(0x02); + send_ctrl_cmd(0xE915); send_data_cmd(0xF0); + + send_ctrl_cmd(0xEA00); send_data_cmd(0x03); + send_ctrl_cmd(0xEA01); send_data_cmd(0x14); + send_ctrl_cmd(0xEA02); send_data_cmd(0x03); + send_ctrl_cmd(0xEA03); send_data_cmd(0x42); + send_ctrl_cmd(0xEA04); send_data_cmd(0x03); + send_ctrl_cmd(0xEA05); send_data_cmd(0x5E); + send_ctrl_cmd(0xEA06); send_data_cmd(0x03); + send_ctrl_cmd(0xEA07); send_data_cmd(0x80); + send_ctrl_cmd(0xEA08); send_data_cmd(0x03); + send_ctrl_cmd(0xEA09); send_data_cmd(0x97); + send_ctrl_cmd(0xEA10); send_data_cmd(0x03); + send_ctrl_cmd(0xEA11); send_data_cmd(0xB0); + send_ctrl_cmd(0xEA12); send_data_cmd(0x03); + send_ctrl_cmd(0xEA13); send_data_cmd(0xC0); + send_ctrl_cmd(0xEA14); send_data_cmd(0x03); + send_ctrl_cmd(0xEA15); send_data_cmd(0xDF); + + send_ctrl_cmd(0x3600); send_data_cmd(0x00);//旋转0XD0 + + send_ctrl_cmd(0x1100); //Sleep Out + MDELAY(150); + + send_ctrl_cmd(0x2900); //Display On +#else + LCD_PRINT("punk,init_lcm_registers -2.1 truly code\n"); + send_ctrl_cmd(0xFF00); send_data_cmd(0xAA); + send_ctrl_cmd(0xFF01); send_data_cmd(0x55); + send_ctrl_cmd(0xFF02); send_data_cmd(0x25); + send_ctrl_cmd(0xFF03); send_data_cmd(0x01); + send_ctrl_cmd(0xFF04); send_data_cmd(0x01); + + send_ctrl_cmd(0xF200); send_data_cmd(0x00); + send_ctrl_cmd(0xF201); send_data_cmd(0x00); + send_ctrl_cmd(0xF202); send_data_cmd(0x4A); + send_ctrl_cmd(0xF203); send_data_cmd(0x0A); + send_ctrl_cmd(0xF204); send_data_cmd(0xA8); + send_ctrl_cmd(0xF205); send_data_cmd(0x00); + send_ctrl_cmd(0xF206); send_data_cmd(0x00); + send_ctrl_cmd(0xF207); send_data_cmd(0x00); + send_ctrl_cmd(0xF208); send_data_cmd(0x00); + send_ctrl_cmd(0xF20A); send_data_cmd(0x00);// 原来是0xF210 + send_ctrl_cmd(0xF20B); send_data_cmd(0x00);// 原来是0xF211 + send_ctrl_cmd(0xF20C); send_data_cmd(0x00);// 原来是0xF212 + send_ctrl_cmd(0xF20D); send_data_cmd(0x00);// 原来是0xF213 + send_ctrl_cmd(0xF20E); send_data_cmd(0x00);// 原来是0xF214 + send_ctrl_cmd(0xF20F); send_data_cmd(0x00);// 原来是0xF215 + send_ctrl_cmd(0xF210); send_data_cmd(0x00);// 原来是0xF216 + send_ctrl_cmd(0xF211); send_data_cmd(0x0B);// 原来是0xF217 + send_ctrl_cmd(0xF212); send_data_cmd(0x00);// 原来是0xF218 + send_ctrl_cmd(0xF213); send_data_cmd(0x00);// 原来是0xF219 + send_ctrl_cmd(0xF214); send_data_cmd(0x00);// 原来是0xF220 + send_ctrl_cmd(0xF215); send_data_cmd(0x00);// 原来是0xF221 + send_ctrl_cmd(0xF216); send_data_cmd(0x00);// 原来是0xF222 + send_ctrl_cmd(0xF217); send_data_cmd(0x00);// 原来是0xF223 + send_ctrl_cmd(0xF218); send_data_cmd(0x00);// 原来是0xF224 + send_ctrl_cmd(0xF219); send_data_cmd(0x00);// 原来是0xF225 + send_ctrl_cmd(0xF21A); send_data_cmd(0x00);// 原来是0xF226 + send_ctrl_cmd(0xF21B); send_data_cmd(0x00);// 原来是0xF227 + send_ctrl_cmd(0xF21C); send_data_cmd(0x40);// 原来是0xF228 + send_ctrl_cmd(0xF21D); send_data_cmd(0x01);// 原来是0xF229 + send_ctrl_cmd(0xF21E); send_data_cmd(0x51);// 原来是0xF230 + send_ctrl_cmd(0xF21F); send_data_cmd(0x00);// 原来是0xF231 + send_ctrl_cmd(0xF220); send_data_cmd(0x01);// 原来是0xF232 + send_ctrl_cmd(0xF221); send_data_cmd(0x00);// 原来是0xF233 + send_ctrl_cmd(0xF222); send_data_cmd(0x01);// 原来是0xF234 + + + send_ctrl_cmd(0xF300); send_data_cmd(0x02); + send_ctrl_cmd(0xF301); send_data_cmd(0x03); + send_ctrl_cmd(0xF302); send_data_cmd(0x07); + send_ctrl_cmd(0xF303); send_data_cmd(0x45); + send_ctrl_cmd(0xF304); send_data_cmd(0x88); + send_ctrl_cmd(0xF305); send_data_cmd(0xD1); + send_ctrl_cmd(0xF306); send_data_cmd(0x0D); + + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + + send_ctrl_cmd(0xB000); send_data_cmd(0x03);//CMRC VSDL HSDL DEDL PCKP DEP HSP VSP + + + send_ctrl_cmd(0xB100); send_data_cmd(0xCC); + send_ctrl_cmd(0xB101); send_data_cmd(0x00);/////////////////////// + send_ctrl_cmd(0xB102); send_data_cmd(0x00); + + send_ctrl_cmd(0xB800); send_data_cmd(0x01); + send_ctrl_cmd(0xB801); send_data_cmd(0x02); + send_ctrl_cmd(0xB802); send_data_cmd(0x02); + send_ctrl_cmd(0xB803); send_data_cmd(0x02); + + send_ctrl_cmd(0xBC00); send_data_cmd(0x00);//NLA2 NLA1 NLA0 + send_ctrl_cmd(0xBC01); send_data_cmd(0x00);//NLB2 NLB1 NLB0 + send_ctrl_cmd(0xBC02); send_data_cmd(0x00);//NLC2 NLC1 NLC0 + + send_ctrl_cmd(0xC900); send_data_cmd(0x63); + send_ctrl_cmd(0xC901); send_data_cmd(0x06); + send_ctrl_cmd(0xC902); send_data_cmd(0x0D); + send_ctrl_cmd(0xC903); send_data_cmd(0x1A); + send_ctrl_cmd(0xC904); send_data_cmd(0x17); + send_ctrl_cmd(0xC905); send_data_cmd(0x00); + + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x01); + + send_ctrl_cmd(0xB000); send_data_cmd(0x05); + send_ctrl_cmd(0xB001); send_data_cmd(0x05); + send_ctrl_cmd(0xB002); send_data_cmd(0x05); + + send_ctrl_cmd(0xB100); send_data_cmd(0x05); + send_ctrl_cmd(0xB101); send_data_cmd(0x05); + send_ctrl_cmd(0xB102); send_data_cmd(0x05); + + send_ctrl_cmd(0xB200); send_data_cmd(0x01); + send_ctrl_cmd(0xB201); send_data_cmd(0x01); + send_ctrl_cmd(0xB202); send_data_cmd(0x01); + + send_ctrl_cmd(0xB300); send_data_cmd(0x0E); + send_ctrl_cmd(0xB301); send_data_cmd(0x0E); + send_ctrl_cmd(0xB302); send_data_cmd(0x0E); + + send_ctrl_cmd(0xB400); send_data_cmd(0x0A); + send_ctrl_cmd(0xB401); send_data_cmd(0x0A); + send_ctrl_cmd(0xB402); send_data_cmd(0x0A); + + send_ctrl_cmd(0xB600); send_data_cmd(0x44); + send_ctrl_cmd(0xB601); send_data_cmd(0x44); + send_ctrl_cmd(0xB602); send_data_cmd(0x44); + + send_ctrl_cmd(0xB700); send_data_cmd(0x34); + send_ctrl_cmd(0xB701); send_data_cmd(0x34); + send_ctrl_cmd(0xB702); send_data_cmd(0x34); + + send_ctrl_cmd(0xB800); send_data_cmd(0x20);//Set VCL boosting times/frequency + send_ctrl_cmd(0xB801); send_data_cmd(0x20); + send_ctrl_cmd(0xB802); send_data_cmd(0x20); + + send_ctrl_cmd(0xB900); send_data_cmd(0x26);//Set VGH boosting times/frequency + send_ctrl_cmd(0xB901); send_data_cmd(0x26); + send_ctrl_cmd(0xB902); send_data_cmd(0x26); + + send_ctrl_cmd(0xBA00); send_data_cmd(0x24);//Set VGLX boosting times/frequency + send_ctrl_cmd(0xBA01); send_data_cmd(0x24); + send_ctrl_cmd(0xBA02); send_data_cmd(0x24); + + send_ctrl_cmd(0xBC00); send_data_cmd(0x00);//Set VGMP/VGSP voltages + send_ctrl_cmd(0xBC01); send_data_cmd(0xC8); + send_ctrl_cmd(0xBC02); send_data_cmd(0x00); + + send_ctrl_cmd(0xBD00); send_data_cmd(0x00);//Set VGMN/VGSN voltages + send_ctrl_cmd(0xBD01); send_data_cmd(0xC8); + send_ctrl_cmd(0xBD02); send_data_cmd(0x00); + + send_ctrl_cmd(0xBE00); send_data_cmd(0x71);//Setting DC VCOM offset + + send_ctrl_cmd(0xC000); send_data_cmd(0x04); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + + send_ctrl_cmd(0xCA00); send_data_cmd(0x00);//Gate signal voltage control + + send_ctrl_cmd(0xD000); send_data_cmd(0x0A); + send_ctrl_cmd(0xD001); send_data_cmd(0x10); + send_ctrl_cmd(0xD002); send_data_cmd(0x0D); + send_ctrl_cmd(0xD003); send_data_cmd(0x0F); + + send_ctrl_cmd(0xD100); send_data_cmd(0x00); + send_ctrl_cmd(0xD101); send_data_cmd(0x70); + send_ctrl_cmd(0xD102); send_data_cmd(0x00); + send_ctrl_cmd(0xD103); send_data_cmd(0xCE); + send_ctrl_cmd(0xD104); send_data_cmd(0x00); + send_ctrl_cmd(0xD105); send_data_cmd(0xF7); + send_ctrl_cmd(0xD106); send_data_cmd(0x01); + send_ctrl_cmd(0xD107); send_data_cmd(0x10); + send_ctrl_cmd(0xD108); send_data_cmd(0x01); + send_ctrl_cmd(0xD109); send_data_cmd(0x21); + send_ctrl_cmd(0xD10A); send_data_cmd(0x01); + send_ctrl_cmd(0xD10B); send_data_cmd(0x44); + send_ctrl_cmd(0xD10C); send_data_cmd(0x01); + send_ctrl_cmd(0xD10D); send_data_cmd(0x62); + send_ctrl_cmd(0xD10E); send_data_cmd(0x01); + send_ctrl_cmd(0xD10F); send_data_cmd(0x8D); + + send_ctrl_cmd(0xD200); send_data_cmd(0x01); + send_ctrl_cmd(0xD201); send_data_cmd(0xAF); + send_ctrl_cmd(0xD202); send_data_cmd(0x01); + send_ctrl_cmd(0xD203); send_data_cmd(0xE4); + send_ctrl_cmd(0xD204); send_data_cmd(0x02); + send_ctrl_cmd(0xD205); send_data_cmd(0x0C); + send_ctrl_cmd(0xD206); send_data_cmd(0x02); + send_ctrl_cmd(0xD207); send_data_cmd(0x4D); + send_ctrl_cmd(0xD208); send_data_cmd(0x02); + send_ctrl_cmd(0xD209); send_data_cmd(0x82); + send_ctrl_cmd(0xD20A); send_data_cmd(0x02); + send_ctrl_cmd(0xD20B); send_data_cmd(0x84); + send_ctrl_cmd(0xD20C); send_data_cmd(0x02); + send_ctrl_cmd(0xD20D); send_data_cmd(0xB8); + send_ctrl_cmd(0xD20E); send_data_cmd(0x02); + send_ctrl_cmd(0xD20F); send_data_cmd(0xF0); + + send_ctrl_cmd(0xD300); send_data_cmd(0x03); + send_ctrl_cmd(0xD301); send_data_cmd(0x14); + send_ctrl_cmd(0xD302); send_data_cmd(0x03); + send_ctrl_cmd(0xD303); send_data_cmd(0x42); + send_ctrl_cmd(0xD304); send_data_cmd(0x03); + send_ctrl_cmd(0xD305); send_data_cmd(0x5E); + send_ctrl_cmd(0xD306); send_data_cmd(0x03); + send_ctrl_cmd(0xD307); send_data_cmd(0x80); + send_ctrl_cmd(0xD308); send_data_cmd(0x03); + send_ctrl_cmd(0xD309); send_data_cmd(0x97); + send_ctrl_cmd(0xD30A); send_data_cmd(0x03); + send_ctrl_cmd(0xD30B); send_data_cmd(0xB0); + send_ctrl_cmd(0xD30C); send_data_cmd(0x03); + send_ctrl_cmd(0xD30D); send_data_cmd(0xC0); + send_ctrl_cmd(0xD30E); send_data_cmd(0x03); + send_ctrl_cmd(0xD30F); send_data_cmd(0xDF); + + send_ctrl_cmd(0xD400); send_data_cmd(0x03); + send_ctrl_cmd(0xD401); send_data_cmd(0xFD); + send_ctrl_cmd(0xD402); send_data_cmd(0x03); + send_ctrl_cmd(0xD403); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD500); send_data_cmd(0x00); + send_ctrl_cmd(0xD501); send_data_cmd(0x70); + send_ctrl_cmd(0xD502); send_data_cmd(0x00); + send_ctrl_cmd(0xD503); send_data_cmd(0xCE); + send_ctrl_cmd(0xD504); send_data_cmd(0x00); + send_ctrl_cmd(0xD505); send_data_cmd(0xF7); + send_ctrl_cmd(0xD506); send_data_cmd(0x01); + send_ctrl_cmd(0xD507); send_data_cmd(0x10); + send_ctrl_cmd(0xD508); send_data_cmd(0x01); + send_ctrl_cmd(0xD509); send_data_cmd(0x21); + send_ctrl_cmd(0xD50A); send_data_cmd(0x01); + send_ctrl_cmd(0xD50B); send_data_cmd(0x44); + send_ctrl_cmd(0xD50C); send_data_cmd(0x01); + send_ctrl_cmd(0xD50D); send_data_cmd(0x62); + send_ctrl_cmd(0xD50E); send_data_cmd(0x01); + send_ctrl_cmd(0xD50F); send_data_cmd(0x8D); + + send_ctrl_cmd(0xD600); send_data_cmd(0x01); + send_ctrl_cmd(0xD601); send_data_cmd(0xAF); + send_ctrl_cmd(0xD602); send_data_cmd(0x01); + send_ctrl_cmd(0xD603); send_data_cmd(0xE4); + send_ctrl_cmd(0xD604); send_data_cmd(0x02); + send_ctrl_cmd(0xD605); send_data_cmd(0x0C); + send_ctrl_cmd(0xD606); send_data_cmd(0x02); + send_ctrl_cmd(0xD607); send_data_cmd(0x4D); + send_ctrl_cmd(0xD608); send_data_cmd(0x02); + send_ctrl_cmd(0xD609); send_data_cmd(0x82); + send_ctrl_cmd(0xD60A); send_data_cmd(0x02); + send_ctrl_cmd(0xD60B); send_data_cmd(0x84); + send_ctrl_cmd(0xD60C); send_data_cmd(0x02); + send_ctrl_cmd(0xD60D); send_data_cmd(0xB8); + send_ctrl_cmd(0xD60E); send_data_cmd(0x02); + send_ctrl_cmd(0xD60F); send_data_cmd(0xF0); + + send_ctrl_cmd(0xD700); send_data_cmd(0x03); + send_ctrl_cmd(0xD701); send_data_cmd(0x14); + send_ctrl_cmd(0xD702); send_data_cmd(0x03); + send_ctrl_cmd(0xD703); send_data_cmd(0x42); + send_ctrl_cmd(0xD704); send_data_cmd(0x03); + send_ctrl_cmd(0xD705); send_data_cmd(0x5E); + send_ctrl_cmd(0xD706); send_data_cmd(0x03); + send_ctrl_cmd(0xD707); send_data_cmd(0x80); + send_ctrl_cmd(0xD708); send_data_cmd(0x03); + send_ctrl_cmd(0xD709); send_data_cmd(0x97); + send_ctrl_cmd(0xD70A); send_data_cmd(0x03); + send_ctrl_cmd(0xD70B); send_data_cmd(0xB0); + send_ctrl_cmd(0xD70C); send_data_cmd(0x03); + send_ctrl_cmd(0xD70D); send_data_cmd(0xC0); + send_ctrl_cmd(0xD70E); send_data_cmd(0x03); + send_ctrl_cmd(0xD70F); send_data_cmd(0xDF); + + send_ctrl_cmd(0xD800); send_data_cmd(0x03); + send_ctrl_cmd(0xD801); send_data_cmd(0xFD); + send_ctrl_cmd(0xD802); send_data_cmd(0x03); + send_ctrl_cmd(0xD803); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD900); send_data_cmd(0x00); + send_ctrl_cmd(0xD901); send_data_cmd(0x70); + send_ctrl_cmd(0xD902); send_data_cmd(0x00); + send_ctrl_cmd(0xD903); send_data_cmd(0xCE); + send_ctrl_cmd(0xD904); send_data_cmd(0x00); + send_ctrl_cmd(0xD905); send_data_cmd(0xF7); + send_ctrl_cmd(0xD906); send_data_cmd(0x01); + send_ctrl_cmd(0xD907); send_data_cmd(0x10); + send_ctrl_cmd(0xD908); send_data_cmd(0x01); + send_ctrl_cmd(0xD909); send_data_cmd(0x21); + send_ctrl_cmd(0xD90A); send_data_cmd(0x01); + send_ctrl_cmd(0xD90B); send_data_cmd(0x44); + send_ctrl_cmd(0xD90C); send_data_cmd(0x01); + send_ctrl_cmd(0xD90D); send_data_cmd(0x62); + send_ctrl_cmd(0xD90E); send_data_cmd(0x01); + send_ctrl_cmd(0xD90F); send_data_cmd(0x8D); + + send_ctrl_cmd(0xDD00); send_data_cmd(0x01); + send_ctrl_cmd(0xDD01); send_data_cmd(0xAF); + send_ctrl_cmd(0xDD02); send_data_cmd(0x01); + send_ctrl_cmd(0xDD03); send_data_cmd(0xE4); + send_ctrl_cmd(0xDD04); send_data_cmd(0x02); + send_ctrl_cmd(0xDD05); send_data_cmd(0x0C); + send_ctrl_cmd(0xDD06); send_data_cmd(0x02); + send_ctrl_cmd(0xDD07); send_data_cmd(0x4D); + send_ctrl_cmd(0xDD08); send_data_cmd(0x02); + send_ctrl_cmd(0xDD09); send_data_cmd(0x82); + send_ctrl_cmd(0xDD0A); send_data_cmd(0x02); + send_ctrl_cmd(0xDD0B); send_data_cmd(0x84); + send_ctrl_cmd(0xDD0C); send_data_cmd(0x02); + send_ctrl_cmd(0xDD0D); send_data_cmd(0xB8); + send_ctrl_cmd(0xDD0E); send_data_cmd(0x02); + send_ctrl_cmd(0xDD0F); send_data_cmd(0xF0); + + send_ctrl_cmd(0xDE00); send_data_cmd(0x03); + send_ctrl_cmd(0xDE01); send_data_cmd(0x14); + send_ctrl_cmd(0xDE02); send_data_cmd(0x03); + send_ctrl_cmd(0xDE03); send_data_cmd(0x42); + send_ctrl_cmd(0xDE04); send_data_cmd(0x03); + send_ctrl_cmd(0xDE05); send_data_cmd(0x5E); + send_ctrl_cmd(0xDE06); send_data_cmd(0x03); + send_ctrl_cmd(0xDE07); send_data_cmd(0x80); + send_ctrl_cmd(0xDE08); send_data_cmd(0x03); + send_ctrl_cmd(0xDE09); send_data_cmd(0x97); + send_ctrl_cmd(0xDE0A); send_data_cmd(0x03); + send_ctrl_cmd(0xDE0B); send_data_cmd(0xB0); + send_ctrl_cmd(0xDE0C); send_data_cmd(0x03); + send_ctrl_cmd(0xDE0D); send_data_cmd(0xC0); + send_ctrl_cmd(0xDE0E); send_data_cmd(0x03); + send_ctrl_cmd(0xDE0F); send_data_cmd(0xDF); + + send_ctrl_cmd(0xDF00); send_data_cmd(0x03); + send_ctrl_cmd(0xDF01); send_data_cmd(0xFD); + send_ctrl_cmd(0xDF02); send_data_cmd(0x03); + send_ctrl_cmd(0xDF03); send_data_cmd(0xFF); + + send_ctrl_cmd(0xE000); send_data_cmd(0x00); + send_ctrl_cmd(0xE001); send_data_cmd(0x70); + send_ctrl_cmd(0xE002); send_data_cmd(0x00); + send_ctrl_cmd(0xE003); send_data_cmd(0xCE); + send_ctrl_cmd(0xE004); send_data_cmd(0x00); + send_ctrl_cmd(0xE005); send_data_cmd(0xF7); + send_ctrl_cmd(0xE006); send_data_cmd(0x01); + send_ctrl_cmd(0xE007); send_data_cmd(0x10); + send_ctrl_cmd(0xE008); send_data_cmd(0x01); + send_ctrl_cmd(0xE009); send_data_cmd(0x21); + send_ctrl_cmd(0xE00A); send_data_cmd(0x01); + send_ctrl_cmd(0xE00B); send_data_cmd(0x44); + send_ctrl_cmd(0xE00C); send_data_cmd(0x01); + send_ctrl_cmd(0xE00D); send_data_cmd(0x62); + send_ctrl_cmd(0xE00E); send_data_cmd(0x01); + send_ctrl_cmd(0xE00F); send_data_cmd(0x8D); + + send_ctrl_cmd(0xE100); send_data_cmd(0x01); + send_ctrl_cmd(0xE101); send_data_cmd(0xAF); + send_ctrl_cmd(0xE102); send_data_cmd(0x01); + send_ctrl_cmd(0xE103); send_data_cmd(0xE4); + send_ctrl_cmd(0xE104); send_data_cmd(0x02); + send_ctrl_cmd(0xE105); send_data_cmd(0x0C); + send_ctrl_cmd(0xE106); send_data_cmd(0x02); + send_ctrl_cmd(0xE107); send_data_cmd(0x4D); + send_ctrl_cmd(0xE108); send_data_cmd(0x02); + send_ctrl_cmd(0xE109); send_data_cmd(0x82); + send_ctrl_cmd(0xE10A); send_data_cmd(0x02); + send_ctrl_cmd(0xE10B); send_data_cmd(0x84); + send_ctrl_cmd(0xE10C); send_data_cmd(0x02); + send_ctrl_cmd(0xE10D); send_data_cmd(0xB8); + send_ctrl_cmd(0xE10E); send_data_cmd(0x02); + send_ctrl_cmd(0xE10F); send_data_cmd(0xF0); + + send_ctrl_cmd(0xE200); send_data_cmd(0x03); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x03); + send_ctrl_cmd(0xE203); send_data_cmd(0x42); + send_ctrl_cmd(0xE204); send_data_cmd(0x03); + send_ctrl_cmd(0xE205); send_data_cmd(0x5E); + send_ctrl_cmd(0xE206); send_data_cmd(0x03); + send_ctrl_cmd(0xE207); send_data_cmd(0x80); + send_ctrl_cmd(0xE208); send_data_cmd(0x03); + send_ctrl_cmd(0xE209); send_data_cmd(0x97); + send_ctrl_cmd(0xE20A); send_data_cmd(0x03); + send_ctrl_cmd(0xE20B); send_data_cmd(0xB0); + send_ctrl_cmd(0xE20C); send_data_cmd(0x03); + send_ctrl_cmd(0xE20D); send_data_cmd(0xC0); + send_ctrl_cmd(0xE20E); send_data_cmd(0x03); + send_ctrl_cmd(0xE20F); send_data_cmd(0xDF); + + send_ctrl_cmd(0xE300); send_data_cmd(0x03); + send_ctrl_cmd(0xE301); send_data_cmd(0xFD); + send_ctrl_cmd(0xE302); send_data_cmd(0x03); + send_ctrl_cmd(0xE303); send_data_cmd(0xFF); + + send_ctrl_cmd(0xE400); send_data_cmd(0x00); + send_ctrl_cmd(0xE401); send_data_cmd(0x70); + send_ctrl_cmd(0xE402); send_data_cmd(0x00); + send_ctrl_cmd(0xE403); send_data_cmd(0xCE); + send_ctrl_cmd(0xE404); send_data_cmd(0x00); + send_ctrl_cmd(0xE405); send_data_cmd(0xF7); + send_ctrl_cmd(0xE406); send_data_cmd(0x01); + send_ctrl_cmd(0xE407); send_data_cmd(0x10); + send_ctrl_cmd(0xE408); send_data_cmd(0x01); + send_ctrl_cmd(0xE409); send_data_cmd(0x21); + send_ctrl_cmd(0xE40A); send_data_cmd(0x01); + send_ctrl_cmd(0xE40B); send_data_cmd(0x44); + send_ctrl_cmd(0xE40C); send_data_cmd(0x01); + send_ctrl_cmd(0xE40D); send_data_cmd(0x62); + send_ctrl_cmd(0xE40E); send_data_cmd(0x01); + send_ctrl_cmd(0xE40F); send_data_cmd(0x8D); + + send_ctrl_cmd(0xE500); send_data_cmd(0x01); + send_ctrl_cmd(0xE501); send_data_cmd(0xAF); + send_ctrl_cmd(0xE502); send_data_cmd(0x01); + send_ctrl_cmd(0xE503); send_data_cmd(0xE4); + send_ctrl_cmd(0xE504); send_data_cmd(0x02); + send_ctrl_cmd(0xE505); send_data_cmd(0x0C); + send_ctrl_cmd(0xE506); send_data_cmd(0x02); + send_ctrl_cmd(0xE507); send_data_cmd(0x4D); + send_ctrl_cmd(0xE508); send_data_cmd(0x02); + send_ctrl_cmd(0xE509); send_data_cmd(0x82); + send_ctrl_cmd(0xE50A); send_data_cmd(0x02); + send_ctrl_cmd(0xE50B); send_data_cmd(0x84); + send_ctrl_cmd(0xE50C); send_data_cmd(0x02); + send_ctrl_cmd(0xE50D); send_data_cmd(0xB8); + send_ctrl_cmd(0xE50E); send_data_cmd(0x02); + send_ctrl_cmd(0xE50F); send_data_cmd(0xF0); + + send_ctrl_cmd(0xE600); send_data_cmd(0x03); + send_ctrl_cmd(0xE601); send_data_cmd(0x14); + send_ctrl_cmd(0xE602); send_data_cmd(0x03); + send_ctrl_cmd(0xE603); send_data_cmd(0x42); + send_ctrl_cmd(0xE604); send_data_cmd(0x03); + send_ctrl_cmd(0xE605); send_data_cmd(0x5E); + send_ctrl_cmd(0xE606); send_data_cmd(0x03); + send_ctrl_cmd(0xE607); send_data_cmd(0x80); + send_ctrl_cmd(0xE608); send_data_cmd(0x03); + send_ctrl_cmd(0xE609); send_data_cmd(0x97); + send_ctrl_cmd(0xE60A); send_data_cmd(0x03); + send_ctrl_cmd(0xE60B); send_data_cmd(0xB0); + send_ctrl_cmd(0xE60C); send_data_cmd(0x03); + send_ctrl_cmd(0xE60D); send_data_cmd(0xC0); + send_ctrl_cmd(0xE60E); send_data_cmd(0x03); + send_ctrl_cmd(0xE60F); send_data_cmd(0xDF); + + send_ctrl_cmd(0xE700); send_data_cmd(0x03); + send_ctrl_cmd(0xE701); send_data_cmd(0xFD); + send_ctrl_cmd(0xE702); send_data_cmd(0x03); + send_ctrl_cmd(0xE703); send_data_cmd(0xFF); + + send_ctrl_cmd(0xE800); send_data_cmd(0x00); + send_ctrl_cmd(0xE801); send_data_cmd(0x70); + send_ctrl_cmd(0xE802); send_data_cmd(0x00); + send_ctrl_cmd(0xE803); send_data_cmd(0xCE); + send_ctrl_cmd(0xE804); send_data_cmd(0x00); + send_ctrl_cmd(0xE805); send_data_cmd(0xF7); + send_ctrl_cmd(0xE806); send_data_cmd(0x01); + send_ctrl_cmd(0xE807); send_data_cmd(0x10); + send_ctrl_cmd(0xE808); send_data_cmd(0x01); + send_ctrl_cmd(0xE809); send_data_cmd(0x21); + send_ctrl_cmd(0xE80A); send_data_cmd(0x01); + send_ctrl_cmd(0xE80B); send_data_cmd(0x44); + send_ctrl_cmd(0xE80C); send_data_cmd(0x01); + send_ctrl_cmd(0xE80D); send_data_cmd(0x62); + send_ctrl_cmd(0xE80E); send_data_cmd(0x01); + send_ctrl_cmd(0xE80F); send_data_cmd(0x8D); + + send_ctrl_cmd(0xE900); send_data_cmd(0x01); + send_ctrl_cmd(0xE901); send_data_cmd(0xAF); + send_ctrl_cmd(0xE902); send_data_cmd(0x01); + send_ctrl_cmd(0xE903); send_data_cmd(0xE4); + send_ctrl_cmd(0xE904); send_data_cmd(0x02); + send_ctrl_cmd(0xE905); send_data_cmd(0x0C); + send_ctrl_cmd(0xE906); send_data_cmd(0x02); + send_ctrl_cmd(0xE907); send_data_cmd(0x4D); + send_ctrl_cmd(0xE908); send_data_cmd(0x02); + send_ctrl_cmd(0xE909); send_data_cmd(0x82); + send_ctrl_cmd(0xE90A); send_data_cmd(0x02); + send_ctrl_cmd(0xE90B); send_data_cmd(0x84); + send_ctrl_cmd(0xE90C); send_data_cmd(0x02); + send_ctrl_cmd(0xE90D); send_data_cmd(0xB8); + send_ctrl_cmd(0xE90E); send_data_cmd(0x02); + send_ctrl_cmd(0xE90F); send_data_cmd(0xF0); + + send_ctrl_cmd(0xEA00); send_data_cmd(0x03); + send_ctrl_cmd(0xEA01); send_data_cmd(0x14); + send_ctrl_cmd(0xEA02); send_data_cmd(0x03); + send_ctrl_cmd(0xEA03); send_data_cmd(0x42); + send_ctrl_cmd(0xEA04); send_data_cmd(0x03); + send_ctrl_cmd(0xEA05); send_data_cmd(0x5E); + send_ctrl_cmd(0xEA06); send_data_cmd(0x03); + send_ctrl_cmd(0xEA07); send_data_cmd(0x80); + send_ctrl_cmd(0xEA08); send_data_cmd(0x03); + send_ctrl_cmd(0xEA09); send_data_cmd(0x97); + send_ctrl_cmd(0xEA0A); send_data_cmd(0x03); + send_ctrl_cmd(0xEA0B); send_data_cmd(0xB0); + send_ctrl_cmd(0xEA0C); send_data_cmd(0x03); + send_ctrl_cmd(0xEA0D); send_data_cmd(0xC0); + send_ctrl_cmd(0xEA0E); send_data_cmd(0x03); + send_ctrl_cmd(0xEA0F); send_data_cmd(0xDF); + + send_ctrl_cmd(0xEB00);send_data_cmd(0x03); + send_ctrl_cmd(0xEB01);send_data_cmd(0xFD); + send_ctrl_cmd(0xEB02);send_data_cmd(0x03); + send_ctrl_cmd(0xEB03);send_data_cmd(0xFF); + + send_ctrl_cmd(0x3600); send_data_cmd(0x00);//旋转0XD0 + + send_ctrl_cmd(0x1100); //Sleep Out + MDELAY(150); + + send_ctrl_cmd(0x2900); //Display On + + +#endif +} + +static void init_lcm_registers_nt35510(void) +{ + LCD_PRINT("init_lcm_registers_nt35510 -1\n"); +//ENABLE PAGE 1 +send_ctrl_cmd(0xF000);send_data_cmd(0x55); +send_ctrl_cmd(0xF001);send_data_cmd(0xAA); +send_ctrl_cmd(0xF002);send_data_cmd(0x52); +send_ctrl_cmd(0xF003);send_data_cmd(0x08); +send_ctrl_cmd(0xF004);send_data_cmd(0x00); + +send_ctrl_cmd(0xB100);send_data_cmd(0x0C); +send_ctrl_cmd(0xB101);send_data_cmd(0x00); + +//VGMP/VGMN/VCOM SETING +send_ctrl_cmd(0xBC00);send_data_cmd(0x05); +send_ctrl_cmd(0xBC01);send_data_cmd(0x05); +send_ctrl_cmd(0xBC02);send_data_cmd(0x05); + +send_ctrl_cmd(0xF000);send_data_cmd(0x55); +send_ctrl_cmd(0xF001);send_data_cmd(0xAA); +send_ctrl_cmd(0xF002);send_data_cmd(0x52); +send_ctrl_cmd(0xF003);send_data_cmd(0x08); +send_ctrl_cmd(0xF004);send_data_cmd(0x01); + +//BGH VOLTAGE SETTING +send_ctrl_cmd(0xB900);send_data_cmd(0x24); +send_ctrl_cmd(0xB901);send_data_cmd(0x24); +send_ctrl_cmd(0xB902);send_data_cmd(0x24); + +//VGLX VOLTAGE SETTING +send_ctrl_cmd(0xBA00);send_data_cmd(0x24); +send_ctrl_cmd(0xBA01);send_data_cmd(0x24); +send_ctrl_cmd(0xBA02);send_data_cmd(0x24); + +send_ctrl_cmd(0xBE00);send_data_cmd(0x00);//40 +send_ctrl_cmd(0xBE01);send_data_cmd(0x78);//78 + +//Z-INVERSION +send_ctrl_cmd(0xBC00);send_data_cmd(0x00); +send_ctrl_cmd(0xBC01);send_data_cmd(0x88); +send_ctrl_cmd(0xBC02);send_data_cmd(0x01); + +send_ctrl_cmd(0xBD00);send_data_cmd(0x00); +send_ctrl_cmd(0xBD01);send_data_cmd(0x88); +send_ctrl_cmd(0xBD02);send_data_cmd(0x01); + +//GAMMA SETING RED +send_ctrl_cmd(0xD100);send_data_cmd(0x00); +send_ctrl_cmd(0xD101);send_data_cmd(0x00); +send_ctrl_cmd(0xD102);send_data_cmd(0x00); +send_ctrl_cmd(0xD103);send_data_cmd(0x16); +send_ctrl_cmd(0xD104);send_data_cmd(0x00); +send_ctrl_cmd(0xD105);send_data_cmd(0x42); +send_ctrl_cmd(0xD106);send_data_cmd(0x00); +send_ctrl_cmd(0xD107);send_data_cmd(0x61); +send_ctrl_cmd(0xD108);send_data_cmd(0x00); +send_ctrl_cmd(0xD109);send_data_cmd(0x74); +send_ctrl_cmd(0xD10A);send_data_cmd(0x00); +send_ctrl_cmd(0xD10B);send_data_cmd(0x97); +send_ctrl_cmd(0xD10C);send_data_cmd(0x00); +send_ctrl_cmd(0xD10D);send_data_cmd(0xAD); +send_ctrl_cmd(0xD10E);send_data_cmd(0x00); +send_ctrl_cmd(0xD10F);send_data_cmd(0xDE); +send_ctrl_cmd(0xD110);send_data_cmd(0x01); +send_ctrl_cmd(0xD111);send_data_cmd(0x00); +send_ctrl_cmd(0xD112);send_data_cmd(0x01); +send_ctrl_cmd(0xD113);send_data_cmd(0x26); +send_ctrl_cmd(0xD114);send_data_cmd(0x01); +send_ctrl_cmd(0xD115);send_data_cmd(0x50); +send_ctrl_cmd(0xD116);send_data_cmd(0x01); +send_ctrl_cmd(0xD117);send_data_cmd(0x87); +send_ctrl_cmd(0xD118);send_data_cmd(0x01); +send_ctrl_cmd(0xD119);send_data_cmd(0xB3); +send_ctrl_cmd(0xD11A);send_data_cmd(0x01); +send_ctrl_cmd(0xD11B);send_data_cmd(0xB6); +send_ctrl_cmd(0xD11C);send_data_cmd(0x01); +send_ctrl_cmd(0xD11D);send_data_cmd(0xDC); +send_ctrl_cmd(0xD11E);send_data_cmd(0x02); +send_ctrl_cmd(0xD11F);send_data_cmd(0x04); +send_ctrl_cmd(0xD120);send_data_cmd(0x02); +send_ctrl_cmd(0xD121);send_data_cmd(0x1C); +send_ctrl_cmd(0xD122);send_data_cmd(0x02); +send_ctrl_cmd(0xD123);send_data_cmd(0x34); +send_ctrl_cmd(0xD124);send_data_cmd(0x02); +send_ctrl_cmd(0xD125);send_data_cmd(0x4E); +send_ctrl_cmd(0xD126);send_data_cmd(0x02); +send_ctrl_cmd(0xD127);send_data_cmd(0x8A); +send_ctrl_cmd(0xD128);send_data_cmd(0x02); +send_ctrl_cmd(0xD129);send_data_cmd(0xC2); +send_ctrl_cmd(0xD12A);send_data_cmd(0x03); +send_ctrl_cmd(0xD12B);send_data_cmd(0x04); +send_ctrl_cmd(0xD12C);send_data_cmd(0x03); +send_ctrl_cmd(0xD12D);send_data_cmd(0x2E); +send_ctrl_cmd(0xD12E);send_data_cmd(0x03); +send_ctrl_cmd(0xD12F);send_data_cmd(0x74); +send_ctrl_cmd(0xD130);send_data_cmd(0x03); +send_ctrl_cmd(0xD131);send_data_cmd(0xEB); +send_ctrl_cmd(0xD132);send_data_cmd(0x03); +send_ctrl_cmd(0xD133);send_data_cmd(0xFF); + +//GAMMA SETING RED +send_ctrl_cmd(0xD200);send_data_cmd(0x00); +send_ctrl_cmd(0xD201);send_data_cmd(0x00); +send_ctrl_cmd(0xD202);send_data_cmd(0x00); +send_ctrl_cmd(0xD203);send_data_cmd(0x16); +send_ctrl_cmd(0xD204);send_data_cmd(0x00); +send_ctrl_cmd(0xD205);send_data_cmd(0x42); +send_ctrl_cmd(0xD206);send_data_cmd(0x00); +send_ctrl_cmd(0xD207);send_data_cmd(0x61); +send_ctrl_cmd(0xD208);send_data_cmd(0x00); +send_ctrl_cmd(0xD209);send_data_cmd(0x74); +send_ctrl_cmd(0xD20A);send_data_cmd(0x00); +send_ctrl_cmd(0xD20B);send_data_cmd(0x97); +send_ctrl_cmd(0xD20C);send_data_cmd(0x00); +send_ctrl_cmd(0xD20D);send_data_cmd(0xAD); +send_ctrl_cmd(0xD20E);send_data_cmd(0x00); +send_ctrl_cmd(0xD20F);send_data_cmd(0xDE); +send_ctrl_cmd(0xD210);send_data_cmd(0x01); +send_ctrl_cmd(0xD211);send_data_cmd(0x00); +send_ctrl_cmd(0xD212);send_data_cmd(0x01); +send_ctrl_cmd(0xD213);send_data_cmd(0x26); +send_ctrl_cmd(0xD214);send_data_cmd(0x01); +send_ctrl_cmd(0xD215);send_data_cmd(0x50); +send_ctrl_cmd(0xD216);send_data_cmd(0x01); +send_ctrl_cmd(0xD217);send_data_cmd(0x87); +send_ctrl_cmd(0xD218);send_data_cmd(0x01); +send_ctrl_cmd(0xD219);send_data_cmd(0xB3); +send_ctrl_cmd(0xD21A);send_data_cmd(0x01); +send_ctrl_cmd(0xD21B);send_data_cmd(0xB6); +send_ctrl_cmd(0xD21C);send_data_cmd(0x01); +send_ctrl_cmd(0xD21D);send_data_cmd(0xDC); +send_ctrl_cmd(0xD21E);send_data_cmd(0x02); +send_ctrl_cmd(0xD21F);send_data_cmd(0x04); +send_ctrl_cmd(0xD220);send_data_cmd(0x02); +send_ctrl_cmd(0xD221);send_data_cmd(0x1C); +send_ctrl_cmd(0xD222);send_data_cmd(0x02); +send_ctrl_cmd(0xD223);send_data_cmd(0x34); +send_ctrl_cmd(0xD224);send_data_cmd(0x02); +send_ctrl_cmd(0xD225);send_data_cmd(0x4E); +send_ctrl_cmd(0xD226);send_data_cmd(0x02); +send_ctrl_cmd(0xD227);send_data_cmd(0x8A); +send_ctrl_cmd(0xD228);send_data_cmd(0x02); +send_ctrl_cmd(0xD229);send_data_cmd(0xC2); +send_ctrl_cmd(0xD22A);send_data_cmd(0x03); +send_ctrl_cmd(0xD22B);send_data_cmd(0x04); +send_ctrl_cmd(0xD22C);send_data_cmd(0x03); +send_ctrl_cmd(0xD22D);send_data_cmd(0x2E); +send_ctrl_cmd(0xD22E);send_data_cmd(0x03); +send_ctrl_cmd(0xD22F);send_data_cmd(0x74); +send_ctrl_cmd(0xD230);send_data_cmd(0x03); +send_ctrl_cmd(0xD231);send_data_cmd(0xEB); +send_ctrl_cmd(0xD232);send_data_cmd(0x03); +send_ctrl_cmd(0xD233);send_data_cmd(0xFF); + + +//GAMMA SETING RED +send_ctrl_cmd(0xD300);send_data_cmd(0x00); +send_ctrl_cmd(0xD301);send_data_cmd(0x00); +send_ctrl_cmd(0xD302);send_data_cmd(0x00); +send_ctrl_cmd(0xD303);send_data_cmd(0x16); +send_ctrl_cmd(0xD304);send_data_cmd(0x00); +send_ctrl_cmd(0xD305);send_data_cmd(0x42); +send_ctrl_cmd(0xD306);send_data_cmd(0x00); +send_ctrl_cmd(0xD307);send_data_cmd(0x61); +send_ctrl_cmd(0xD308);send_data_cmd(0x00); +send_ctrl_cmd(0xD309);send_data_cmd(0x74); +send_ctrl_cmd(0xD30A);send_data_cmd(0x00); +send_ctrl_cmd(0xD30B);send_data_cmd(0x97); +send_ctrl_cmd(0xD30C);send_data_cmd(0x00); +send_ctrl_cmd(0xD30D);send_data_cmd(0xAD); +send_ctrl_cmd(0xD30E);send_data_cmd(0x00); +send_ctrl_cmd(0xD30F);send_data_cmd(0xDE); +send_ctrl_cmd(0xD310);send_data_cmd(0x01); +send_ctrl_cmd(0xD311);send_data_cmd(0x00); +send_ctrl_cmd(0xD312);send_data_cmd(0x01); +send_ctrl_cmd(0xD313);send_data_cmd(0x26); +send_ctrl_cmd(0xD314);send_data_cmd(0x01); +send_ctrl_cmd(0xD315);send_data_cmd(0x50); +send_ctrl_cmd(0xD316);send_data_cmd(0x01); +send_ctrl_cmd(0xD317);send_data_cmd(0x87); +send_ctrl_cmd(0xD318);send_data_cmd(0x01); +send_ctrl_cmd(0xD319);send_data_cmd(0xB3); +send_ctrl_cmd(0xD31A);send_data_cmd(0x01); +send_ctrl_cmd(0xD31B);send_data_cmd(0xB6); +send_ctrl_cmd(0xD31C);send_data_cmd(0x01); +send_ctrl_cmd(0xD31D);send_data_cmd(0xDC); +send_ctrl_cmd(0xD31E);send_data_cmd(0x02); +send_ctrl_cmd(0xD31F);send_data_cmd(0x04); +send_ctrl_cmd(0xD320);send_data_cmd(0x02); +send_ctrl_cmd(0xD321);send_data_cmd(0x1C); +send_ctrl_cmd(0xD322);send_data_cmd(0x02); +send_ctrl_cmd(0xD323);send_data_cmd(0x34); +send_ctrl_cmd(0xD324);send_data_cmd(0x02); +send_ctrl_cmd(0xD325);send_data_cmd(0x4E); +send_ctrl_cmd(0xD326);send_data_cmd(0x02); +send_ctrl_cmd(0xD327);send_data_cmd(0x8A); +send_ctrl_cmd(0xD328);send_data_cmd(0x02); +send_ctrl_cmd(0xD329);send_data_cmd(0xC2); +send_ctrl_cmd(0xD32A);send_data_cmd(0x03); +send_ctrl_cmd(0xD32B);send_data_cmd(0x04); +send_ctrl_cmd(0xD32C);send_data_cmd(0x03); +send_ctrl_cmd(0xD32D);send_data_cmd(0x2E); +send_ctrl_cmd(0xD32E);send_data_cmd(0x03); +send_ctrl_cmd(0xD32F);send_data_cmd(0x74); +send_ctrl_cmd(0xD330);send_data_cmd(0x03); +send_ctrl_cmd(0xD331);send_data_cmd(0xEB); +send_ctrl_cmd(0xD332);send_data_cmd(0x03); +send_ctrl_cmd(0xD333);send_data_cmd(0xFF); + + +//GAMMA SETING RED +send_ctrl_cmd(0xD400);send_data_cmd(0x00); +send_ctrl_cmd(0xD401);send_data_cmd(0x00); +send_ctrl_cmd(0xD402);send_data_cmd(0x00); +send_ctrl_cmd(0xD403);send_data_cmd(0x16); +send_ctrl_cmd(0xD404);send_data_cmd(0x00); +send_ctrl_cmd(0xD405);send_data_cmd(0x42); +send_ctrl_cmd(0xD406);send_data_cmd(0x00); +send_ctrl_cmd(0xD407);send_data_cmd(0x61); +send_ctrl_cmd(0xD408);send_data_cmd(0x00); +send_ctrl_cmd(0xD409);send_data_cmd(0x74); +send_ctrl_cmd(0xD40A);send_data_cmd(0x00); +send_ctrl_cmd(0xD40B);send_data_cmd(0x97); +send_ctrl_cmd(0xD40C);send_data_cmd(0x00); +send_ctrl_cmd(0xD40D);send_data_cmd(0xAD); +send_ctrl_cmd(0xD40E);send_data_cmd(0x00); +send_ctrl_cmd(0xD40F);send_data_cmd(0xDE); +send_ctrl_cmd(0xD410);send_data_cmd(0x01); +send_ctrl_cmd(0xD411);send_data_cmd(0x00); +send_ctrl_cmd(0xD412);send_data_cmd(0x01); +send_ctrl_cmd(0xD413);send_data_cmd(0x26); +send_ctrl_cmd(0xD414);send_data_cmd(0x01); +send_ctrl_cmd(0xD415);send_data_cmd(0x50); +send_ctrl_cmd(0xD416);send_data_cmd(0x01); +send_ctrl_cmd(0xD417);send_data_cmd(0x87); +send_ctrl_cmd(0xD418);send_data_cmd(0x01); +send_ctrl_cmd(0xD419);send_data_cmd(0xB3); +send_ctrl_cmd(0xD41A);send_data_cmd(0x01); +send_ctrl_cmd(0xD41B);send_data_cmd(0xB6); +send_ctrl_cmd(0xD41C);send_data_cmd(0x01); +send_ctrl_cmd(0xD41D);send_data_cmd(0xDC); +send_ctrl_cmd(0xD41E);send_data_cmd(0x02); +send_ctrl_cmd(0xD41F);send_data_cmd(0x04); +send_ctrl_cmd(0xD420);send_data_cmd(0x02); +send_ctrl_cmd(0xD421);send_data_cmd(0x1C); +send_ctrl_cmd(0xD422);send_data_cmd(0x02); +send_ctrl_cmd(0xD423);send_data_cmd(0x34); +send_ctrl_cmd(0xD424);send_data_cmd(0x02); +send_ctrl_cmd(0xD425);send_data_cmd(0x4E); +send_ctrl_cmd(0xD426);send_data_cmd(0x02); +send_ctrl_cmd(0xD427);send_data_cmd(0x8A); +send_ctrl_cmd(0xD428);send_data_cmd(0x02); +send_ctrl_cmd(0xD429);send_data_cmd(0xC2); +send_ctrl_cmd(0xD42A);send_data_cmd(0x03); +send_ctrl_cmd(0xD42B);send_data_cmd(0x04); +send_ctrl_cmd(0xD42C);send_data_cmd(0x03); +send_ctrl_cmd(0xD42D);send_data_cmd(0x2E); +send_ctrl_cmd(0xD42E);send_data_cmd(0x03); +send_ctrl_cmd(0xD42F);send_data_cmd(0x74); +send_ctrl_cmd(0xD430);send_data_cmd(0x03); +send_ctrl_cmd(0xD431);send_data_cmd(0xEB); +send_ctrl_cmd(0xD432);send_data_cmd(0x03); +send_ctrl_cmd(0xD433);send_data_cmd(0xFF); + + +//GAMMA SETING RED +send_ctrl_cmd(0xD500);send_data_cmd(0x00); +send_ctrl_cmd(0xD501);send_data_cmd(0x00); +send_ctrl_cmd(0xD502);send_data_cmd(0x00); +send_ctrl_cmd(0xD503);send_data_cmd(0x16); +send_ctrl_cmd(0xD504);send_data_cmd(0x00); +send_ctrl_cmd(0xD505);send_data_cmd(0x42); +send_ctrl_cmd(0xD506);send_data_cmd(0x00); +send_ctrl_cmd(0xD507);send_data_cmd(0x61); +send_ctrl_cmd(0xD508);send_data_cmd(0x00); +send_ctrl_cmd(0xD509);send_data_cmd(0x74); +send_ctrl_cmd(0xD50A);send_data_cmd(0x00); +send_ctrl_cmd(0xD50B);send_data_cmd(0x97); +send_ctrl_cmd(0xD50C);send_data_cmd(0x00); +send_ctrl_cmd(0xD50D);send_data_cmd(0xAD); +send_ctrl_cmd(0xD50E);send_data_cmd(0x00); +send_ctrl_cmd(0xD50F);send_data_cmd(0xDE); +send_ctrl_cmd(0xD510);send_data_cmd(0x01); +send_ctrl_cmd(0xD511);send_data_cmd(0x00); +send_ctrl_cmd(0xD512);send_data_cmd(0x01); +send_ctrl_cmd(0xD513);send_data_cmd(0x26); +send_ctrl_cmd(0xD514);send_data_cmd(0x01); +send_ctrl_cmd(0xD515);send_data_cmd(0x50); +send_ctrl_cmd(0xD516);send_data_cmd(0x01); +send_ctrl_cmd(0xD517);send_data_cmd(0x87); +send_ctrl_cmd(0xD518);send_data_cmd(0x01); +send_ctrl_cmd(0xD519);send_data_cmd(0xB3); +send_ctrl_cmd(0xD51A);send_data_cmd(0x01); +send_ctrl_cmd(0xD51B);send_data_cmd(0xB6); +send_ctrl_cmd(0xD51C);send_data_cmd(0x01); +send_ctrl_cmd(0xD51D);send_data_cmd(0xDC); +send_ctrl_cmd(0xD51E);send_data_cmd(0x02); +send_ctrl_cmd(0xD51F);send_data_cmd(0x04); +send_ctrl_cmd(0xD520);send_data_cmd(0x02); +send_ctrl_cmd(0xD521);send_data_cmd(0x1C); +send_ctrl_cmd(0xD522);send_data_cmd(0x02); +send_ctrl_cmd(0xD523);send_data_cmd(0x34); +send_ctrl_cmd(0xD524);send_data_cmd(0x02); +send_ctrl_cmd(0xD525);send_data_cmd(0x4E); +send_ctrl_cmd(0xD526);send_data_cmd(0x02); +send_ctrl_cmd(0xD527);send_data_cmd(0x8A); +send_ctrl_cmd(0xD528);send_data_cmd(0x02); +send_ctrl_cmd(0xD529);send_data_cmd(0xC2); +send_ctrl_cmd(0xD52A);send_data_cmd(0x03); +send_ctrl_cmd(0xD52B);send_data_cmd(0x04); +send_ctrl_cmd(0xD52C);send_data_cmd(0x03); +send_ctrl_cmd(0xD52D);send_data_cmd(0x2E); +send_ctrl_cmd(0xD52E);send_data_cmd(0x03); +send_ctrl_cmd(0xD52F);send_data_cmd(0x74); +send_ctrl_cmd(0xD530);send_data_cmd(0x03); +send_ctrl_cmd(0xD531);send_data_cmd(0xEB); +send_ctrl_cmd(0xD532);send_data_cmd(0x03); +send_ctrl_cmd(0xD533);send_data_cmd(0xFF); + + + +//GAMMA SETING RED +send_ctrl_cmd(0xD600);send_data_cmd(0x00); +send_ctrl_cmd(0xD601);send_data_cmd(0x00); +send_ctrl_cmd(0xD602);send_data_cmd(0x00); +send_ctrl_cmd(0xD603);send_data_cmd(0x16); +send_ctrl_cmd(0xD604);send_data_cmd(0x00); +send_ctrl_cmd(0xD605);send_data_cmd(0x42); +send_ctrl_cmd(0xD606);send_data_cmd(0x00); +send_ctrl_cmd(0xD607);send_data_cmd(0x61); +send_ctrl_cmd(0xD608);send_data_cmd(0x00); +send_ctrl_cmd(0xD609);send_data_cmd(0x74); +send_ctrl_cmd(0xD60A);send_data_cmd(0x00); +send_ctrl_cmd(0xD60B);send_data_cmd(0x97); +send_ctrl_cmd(0xD60C);send_data_cmd(0x00); +send_ctrl_cmd(0xD60D);send_data_cmd(0xAD); +send_ctrl_cmd(0xD60E);send_data_cmd(0x00); +send_ctrl_cmd(0xD60F);send_data_cmd(0xDE); +send_ctrl_cmd(0xD610);send_data_cmd(0x01); +send_ctrl_cmd(0xD611);send_data_cmd(0x00); +send_ctrl_cmd(0xD612);send_data_cmd(0x01); +send_ctrl_cmd(0xD613);send_data_cmd(0x26); +send_ctrl_cmd(0xD614);send_data_cmd(0x01); +send_ctrl_cmd(0xD615);send_data_cmd(0x50); +send_ctrl_cmd(0xD616);send_data_cmd(0x01); +send_ctrl_cmd(0xD617);send_data_cmd(0x87); +send_ctrl_cmd(0xD618);send_data_cmd(0x01); +send_ctrl_cmd(0xD619);send_data_cmd(0xB3); +send_ctrl_cmd(0xD61A);send_data_cmd(0x01); +send_ctrl_cmd(0xD61B);send_data_cmd(0xB6); +send_ctrl_cmd(0xD61C);send_data_cmd(0x01); +send_ctrl_cmd(0xD61D);send_data_cmd(0xDC); +send_ctrl_cmd(0xD61E);send_data_cmd(0x02); +send_ctrl_cmd(0xD61F);send_data_cmd(0x04); +send_ctrl_cmd(0xD620);send_data_cmd(0x02); +send_ctrl_cmd(0xD621);send_data_cmd(0x1C); +send_ctrl_cmd(0xD622);send_data_cmd(0x02); +send_ctrl_cmd(0xD623);send_data_cmd(0x34); +send_ctrl_cmd(0xD624);send_data_cmd(0x02); +send_ctrl_cmd(0xD625);send_data_cmd(0x4E); +send_ctrl_cmd(0xD626);send_data_cmd(0x02); +send_ctrl_cmd(0xD627);send_data_cmd(0x8A); +send_ctrl_cmd(0xD628);send_data_cmd(0x02); +send_ctrl_cmd(0xD629);send_data_cmd(0xC2); +send_ctrl_cmd(0xD62A);send_data_cmd(0x03); +send_ctrl_cmd(0xD62B);send_data_cmd(0x04); +send_ctrl_cmd(0xD62C);send_data_cmd(0x03); +send_ctrl_cmd(0xD62D);send_data_cmd(0x2E); +send_ctrl_cmd(0xD62E);send_data_cmd(0x03); +send_ctrl_cmd(0xD62F);send_data_cmd(0x74); +send_ctrl_cmd(0xD630);send_data_cmd(0x03); +send_ctrl_cmd(0xD631);send_data_cmd(0xEB); +send_ctrl_cmd(0xD632);send_data_cmd(0x03); +send_ctrl_cmd(0xD633);send_data_cmd(0xFF); +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + //lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + + //lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 54;//40?, punk 42->54 57(38M) + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; //LCM_POLARITY_FALLING -> LCM_POLARITY_RISING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + + +#if 1 + /*from truly sandy, for c8*/ + params->dpi.hsync_pulse_width = 6; + params->dpi.hsync_back_porch = 20; + params->dpi.hsync_front_porch = 20; + params->dpi.vsync_pulse_width = 6; + params->dpi.vsync_back_porch = 32; + params->dpi.vsync_front_porch = 32; +#elif 1 + xx + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; +#else + xx + params->dpi.hsync_pulse_width = 12; + params->dpi.hsync_back_porch = 8; + params->dpi.hsync_front_porch = 8; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 8; + params->dpi.vsync_front_porch = 8; +#endif + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current =LCM_DRIVING_CURRENT_6575_4MA;// LCM_DRIVING_CURRENT_6575_4MA; //punk LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_hw_reset(void) +{ + +LCD_PRINT("punk,lcm_hw_reset -0\n "); + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(60); + + SET_RESET_PIN(1); + MDELAY(80); +} + +static void lcm_init(void) +{ + config_gpio(); + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +#if 0 + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(150); + send_ctrl_cmd(0x4f00); + send_data_cmd(0x01); //DSTB +#else + LCD_PRINT("punk,lcm_suspend -1.0\n "); + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + send_ctrl_cmd(0xB100); send_data_cmd(0x4C); + send_ctrl_cmd(0x2800); + MDELAY(10); + send_ctrl_cmd(0x1000); + MDELAY(150); + //Delayms(150); + //Lcd_EnvidOnOff(0); //If using RGB Interface +#endif + +} + + +static void lcm_resume(void) +{ +#if 0 + LCD_PRINT("punk,lcm_resume -1 "); + return;//punk + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(100); +#elif 1 + //Lcd_EnvidOnOff(1); //If using RGB Interface + //MainLCDInitial(); + LCD_PRINT("punk,lcm_resume -1.0\n "); + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + send_ctrl_cmd(0xB100); send_data_cmd(0xCC); + send_ctrl_cmd(0x1100); + MDELAY(150); + send_ctrl_cmd(0x2900); + MDELAY(50); +#else +xx + lcm_hw_reset(); + init_lcm_registers(); +#endif + +/*punk, for tp issue, */ +#ifndef BUILD_UBOOT +#if defined(ACER_C8) + fts_chk_chr(); +#endif +#endif +} + + + +/*for read id adc value*/ +#if 1 //lk + +#ifdef BUILD_UBOOT + +#include "cust_adc.h" +#define ADC_CHECK_COUNT 5 +extern int IMM_GetOneChannelValue(int dwChannel); + +static unsigned int lcm_check_idpin_adc(unsigned char count) +{ + int idpin_auxadc = 0; + int idpin_auxadc_check = 0; + int i = 0; + + for(i = 0;i < count;i++) + { + idpin_auxadc_check = IMM_GetOneChannelValue(AUXADC_LCM_IDPIN_CHANNEL); + idpin_auxadc += idpin_auxadc_check; + printf("LK+++:LCM Check ID pin ADC value[%d]=%d\n",i,idpin_auxadc_check); + } + idpin_auxadc = (idpin_auxadc / count); + printf("LK+++:LCM Check ID pin ADC average value=%d\n",idpin_auxadc); + return idpin_auxadc; +} +#endif + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + +#ifdef BUILD_UBOOT + unsigned int lcm_idpin_value = 0; + + lcm_idpin_value = lcm_check_idpin_adc(ADC_CHECK_COUNT); + + if(/*(LCM == id)&&*/ lcm_idpin_value >= 100)/*1.8v,100=1.0v*/ + { + return 1; + } + else + { + return 0; + } +#else + return 0; +#endif +} + +#endif + + + + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ips3p2620_qhd_nt35516_lcm_drv = +{ + + .name = "ips3p2620", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/kd50m14_wvga_nt35510/tft050a001_wvga_nt35510.c b/acer_e350_simcom75/lcm/kd50m14_wvga_nt35510/tft050a001_wvga_nt35510.c new file mode 100644 index 0000000..966702a --- /dev/null +++ b/acer_e350_simcom75/lcm/kd50m14_wvga_nt35510/tft050a001_wvga_nt35510.c @@ -0,0 +1,1218 @@ + +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + + +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x5510 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_read_data(void) +{ + unsigned int i; + int k=0; + unsigned int getbyte1=0; + unsigned int data=0; + +#ifdef BUILD_UBOOT + printf("spi_read_data \r\n"); +#endif + + data = 0xc0; + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + SET_LA0_INPUT; + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 7)) + { + SET_LSDA_HIGH; + } + else + { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } +#if 0 + for(i=8;i>0;i--) + { + SET_LSCK_LOW; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#endif + UDELAY(5); + for (k = 7; k >=0; k--) + { + SET_LSCK_LOW; + if (GET_LSA0_BIT) + { + getbyte1 |= (1 << k); + } + + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#ifdef BUILD_UBOOT + printf("getbyte1=0x%x \r\n",getbyte1); +#endif + SET_LSDA_HIGH; + SET_LSCE_HIGH; + return getbyte1; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +MDELAY(120); + +set_lcm_register(0xF000,0x55);//Enable Page 0 + +set_lcm_register(0xF001,0xAA); + +set_lcm_register(0xF002,0x52); + +set_lcm_register(0xF003,0x08); + +set_lcm_register(0xF004,0x00);//comand 1 + + + +set_lcm_register(0xB000,0x00);//RGB I/F signal setting + +set_lcm_register(0xB001,0x05); + +set_lcm_register(0xB002,0x02); + +set_lcm_register(0xB003,0x05); + +set_lcm_register(0xB004,0x02); + + + +set_lcm_register(0xB100,0x0C);//Display option control + +set_lcm_register(0xB101,0x00); + + + +set_lcm_register(0xBC00,0x05);//Z-inversion + +set_lcm_register(0xBC01,0x05); + +set_lcm_register(0xBC02,0x05); + + + +set_lcm_register(0xF000,0x55);//Enable Page 1 + +set_lcm_register(0xF001,0xAA); + +set_lcm_register(0xF002,0x52); + +set_lcm_register(0xF003,0x08); + +set_lcm_register(0xF004,0x01); + + + +set_lcm_register(0xB900,0x24);//VGH Voltage setting + +set_lcm_register(0xB901,0x24); + +set_lcm_register(0xB902,0x24); + + + +set_lcm_register(0xBA00,0x24);//VGLX Voltage setting + +set_lcm_register(0xBA01,0x24); + +set_lcm_register(0xBA02,0x24); + + + +set_lcm_register(0xBE00,0x00);//VCOM Voltage setting + +set_lcm_register(0xBE01,0x78); + + + +set_lcm_register(0xBC00,0x00);//VGMP/VGMN Setting + +set_lcm_register(0xBC01,0x88); + +set_lcm_register(0xBC02,0x01); + +set_lcm_register(0xBD00,0x00); + +set_lcm_register(0xBD01,0x88); + +set_lcm_register(0xBD02,0x01); + + + + + +set_lcm_register(0xD100,0x00);//Gamma setting RED + +set_lcm_register(0xD101,0x00); + +set_lcm_register(0xD102,0x00); + +set_lcm_register(0xD103,0x16); + +set_lcm_register(0xD104,0x00); + +set_lcm_register(0xD105,0x42); + +set_lcm_register(0xD106,0x00); + +set_lcm_register(0xD107,0x61); + +set_lcm_register(0xD108,0x00); + +set_lcm_register(0xD109,0x74); + +set_lcm_register(0xD10A,0x00); + +set_lcm_register(0xD10B,0x97); + +set_lcm_register(0xD10C,0x00); + +set_lcm_register(0xD10D,0xAD); + +set_lcm_register(0xD10E,0x00); + +set_lcm_register(0xD10F,0xDE); + +set_lcm_register(0xD110,0x01); + +set_lcm_register(0xD111,0x00); + +set_lcm_register(0xD112,0x01); + +set_lcm_register(0xD113,0x26); + +set_lcm_register(0xD114,0x01); + +set_lcm_register(0xD115,0x50); + +set_lcm_register(0xD116,0x01); + +set_lcm_register(0xD117,0x87); + +set_lcm_register(0xD118,0x01); + +set_lcm_register(0xD119,0xB3); + +set_lcm_register(0xD11A,0x01); + +set_lcm_register(0xD11B,0xB6); + +set_lcm_register(0xD11C,0x01); + +set_lcm_register(0xD11D,0xDC); + +set_lcm_register(0xD11E,0x02); + +set_lcm_register(0xD11F,0x04); + + + +set_lcm_register(0xD120,0x02); + +set_lcm_register(0xD121,0x1C); + +set_lcm_register(0xD122,0x02); + +set_lcm_register(0xD123,0x34); + +set_lcm_register(0xD124,0x02); + +set_lcm_register(0xD125,0x4E); + +set_lcm_register(0xD126,0x02); + +set_lcm_register(0xD127,0x8A); + +set_lcm_register(0xD128,0x02); + +set_lcm_register(0xD129,0xC2); + +set_lcm_register(0xD12A,0x03); + +set_lcm_register(0xD12B,0x04); + +set_lcm_register(0xD12C,0x03); + +set_lcm_register(0xD12D,0x2E); + +set_lcm_register(0xD12E,0x03); + +set_lcm_register(0xD12F,0x74); + +set_lcm_register(0xD130,0x03); + +set_lcm_register(0xD131,0xEB); + +set_lcm_register(0xD132,0x03); + +set_lcm_register(0xD133,0xFF); + + + +//Gamma setting Green positive + +set_lcm_register(0xD200,0x00); + +set_lcm_register(0xD201,0x00); + +set_lcm_register(0xD202,0x00); + +set_lcm_register(0xD203,0x16); + +set_lcm_register(0xD204,0x00); + +set_lcm_register(0xD205,0x42); + +set_lcm_register(0xD206,0x00); + +set_lcm_register(0xD207,0x61); + +set_lcm_register(0xD208,0x00); + +set_lcm_register(0xD209,0x74); + +set_lcm_register(0xD20A,0x00); + +set_lcm_register(0xD20B,0x97); + +set_lcm_register(0xD20C,0x00); + +set_lcm_register(0xD20D,0xAD); + +set_lcm_register(0xD20E,0x00); + +set_lcm_register(0xD20F,0xDE); + +set_lcm_register(0xD210,0x01); + +set_lcm_register(0xD211,0x00); + +set_lcm_register(0xD212,0x01); + +set_lcm_register(0xD213,0x26); + +set_lcm_register(0xD214,0x01); + +set_lcm_register(0xD215,0x50); + +set_lcm_register(0xD216,0x01); + +set_lcm_register(0xD217,0x87); + +set_lcm_register(0xD218,0x01); + +set_lcm_register(0xD219,0xB3); + +set_lcm_register(0xD21A,0x01); + +set_lcm_register(0xD21B,0xB6); + +set_lcm_register(0xD21C,0x01); + +set_lcm_register(0xD21D,0xDC); + +set_lcm_register(0xD21E,0x02); + +set_lcm_register(0xD21F,0x04); + + + +set_lcm_register(0xD220,0x02); + +set_lcm_register(0xD221,0x1C); + +set_lcm_register(0xD222,0x02); + +set_lcm_register(0xD223,0x34); + +set_lcm_register(0xD224,0x02); + +set_lcm_register(0xD225,0x4E); + +set_lcm_register(0xD226,0x02); + +set_lcm_register(0xD227,0x8A); + +set_lcm_register(0xD228,0x02); + +set_lcm_register(0xD229,0xC2); + +set_lcm_register(0xD22A,0x03); + +set_lcm_register(0xD22B,0x04); + +set_lcm_register(0xD22C,0x03); + +set_lcm_register(0xD22D,0x2E); + +set_lcm_register(0xD22E,0x03); + +set_lcm_register(0xD22F,0x74); + +set_lcm_register(0xD230,0x03); + +set_lcm_register(0xD231,0xEB); + +set_lcm_register(0xD232,0x03); + +set_lcm_register(0xD233,0xFF); + + + +//Gamma setting Blue positive + +set_lcm_register(0xD300,0x00); + +set_lcm_register(0xD301,0x00); + +set_lcm_register(0xD302,0x00); + +set_lcm_register(0xD303,0x16); + +set_lcm_register(0xD304,0x00); + +set_lcm_register(0xD305,0x42); + +set_lcm_register(0xD306,0x00); + +set_lcm_register(0xD307,0x61); + +set_lcm_register(0xD308,0x00); + +set_lcm_register(0xD309,0x74); + +set_lcm_register(0xD30A,0x00); + +set_lcm_register(0xD30B,0x97); + +set_lcm_register(0xD30C,0x00); + +set_lcm_register(0xD30D,0xAD); + +set_lcm_register(0xD30E,0x00); + +set_lcm_register(0xD30F,0xDE); + +set_lcm_register(0xD310,0x01); + +set_lcm_register(0xD311,0x00); + +set_lcm_register(0xD312,0x01); + +set_lcm_register(0xD313,0x26); + +set_lcm_register(0xD314,0x01); + +set_lcm_register(0xD315,0x50); + +set_lcm_register(0xD316,0x01); + +set_lcm_register(0xD317,0x87); + +set_lcm_register(0xD318,0x01); + +set_lcm_register(0xD319,0xB3); + +set_lcm_register(0xD31A,0x01); + +set_lcm_register(0xD31B,0xB6); + +set_lcm_register(0xD31C,0x01); + +set_lcm_register(0xD31D,0xDC); + +set_lcm_register(0xD31E,0x02); + +set_lcm_register(0xD31F,0x04); + + + +set_lcm_register(0xD320,0x02); + +set_lcm_register(0xD321,0x1C); + +set_lcm_register(0xD322,0x02); + +set_lcm_register(0xD323,0x34); + +set_lcm_register(0xD324,0x02); + +set_lcm_register(0xD325,0x4E); + +set_lcm_register(0xD326,0x02); + +set_lcm_register(0xD327,0x8A); + +set_lcm_register(0xD328,0x02); + +set_lcm_register(0xD329,0xC2); + +set_lcm_register(0xD32A,0x03); + +set_lcm_register(0xD32B,0x04); + +set_lcm_register(0xD32C,0x03); + +set_lcm_register(0xD32D,0x2E); + +set_lcm_register(0xD32E,0x03); + +set_lcm_register(0xD32F,0x74); + +set_lcm_register(0xD330,0x03); + +set_lcm_register(0xD331,0xEB); + +set_lcm_register(0xD332,0x03); + +set_lcm_register(0xD333,0xFF); + + + +//Gamma setting RED Negative + +set_lcm_register(0xD400,0x00); + +set_lcm_register(0xD401,0x00); + +set_lcm_register(0xD402,0x00); + +set_lcm_register(0xD403,0x16); + +set_lcm_register(0xD404,0x00); + +set_lcm_register(0xD405,0x42); + +set_lcm_register(0xD406,0x00); + +set_lcm_register(0xD407,0x61); + +set_lcm_register(0xD408,0x00); + +set_lcm_register(0xD409,0x74); + +set_lcm_register(0xD40A,0x00); + +set_lcm_register(0xD40B,0x97); + +set_lcm_register(0xD40C,0x00); + +set_lcm_register(0xD40D,0xAD); + +set_lcm_register(0xD40E,0x00); + +set_lcm_register(0xD40F,0xDE); + +set_lcm_register(0xD410,0x01); + +set_lcm_register(0xD411,0x00); + +set_lcm_register(0xD412,0x01); + +set_lcm_register(0xD413,0x26); + +set_lcm_register(0xD414,0x01); + +set_lcm_register(0xD415,0x50); + +set_lcm_register(0xD416,0x01); + +set_lcm_register(0xD417,0x87); + +set_lcm_register(0xD418,0x01); + +set_lcm_register(0xD419,0xB3); + +set_lcm_register(0xD41A,0x01); + +set_lcm_register(0xD41B,0xB6); + +set_lcm_register(0xD41C,0x01); + +set_lcm_register(0xD41D,0xDC); + +set_lcm_register(0xD41E,0x02); + +set_lcm_register(0xD41F,0x04); + + + +set_lcm_register(0xD420,0x02); + +set_lcm_register(0xD421,0x1C); + +set_lcm_register(0xD422,0x02); + +set_lcm_register(0xD423,0x34); + +set_lcm_register(0xD424,0x02); + +set_lcm_register(0xD425,0x4E); + +set_lcm_register(0xD426,0x02); + +set_lcm_register(0xD427,0x8A); + +set_lcm_register(0xD428,0x02); + +set_lcm_register(0xD429,0xC2); + +set_lcm_register(0xD42A,0x03); + +set_lcm_register(0xD42B,0x04); + +set_lcm_register(0xD42C,0x03); + +set_lcm_register(0xD42D,0x2E); + +set_lcm_register(0xD42E,0x03); + +set_lcm_register(0xD42F,0x74); + +set_lcm_register(0xD430,0x03); + +set_lcm_register(0xD431,0xEB); + +set_lcm_register(0xD432,0x03); + +set_lcm_register(0xD433,0xFF); + + + +//Gamma setting Green Negative + +set_lcm_register(0xD500,0x00); + +set_lcm_register(0xD501,0x00); + +set_lcm_register(0xD502,0x00); + +set_lcm_register(0xD503,0x16); + +set_lcm_register(0xD504,0x00); + +set_lcm_register(0xD505,0x42); + +set_lcm_register(0xD506,0x00); + +set_lcm_register(0xD507,0x61); + +set_lcm_register(0xD508,0x00); + +set_lcm_register(0xD509,0x74); + +set_lcm_register(0xD50A,0x00); + +set_lcm_register(0xD50B,0x97); + +set_lcm_register(0xD50C,0x00); + +set_lcm_register(0xD50D,0xAD); + +set_lcm_register(0xD50E,0x00); + +set_lcm_register(0xD50F,0xDE); + +set_lcm_register(0xD510,0x01); + +set_lcm_register(0xD511,0x00); + +set_lcm_register(0xD512,0x01); + +set_lcm_register(0xD513,0x26); + +set_lcm_register(0xD514,0x01); + +set_lcm_register(0xD515,0x50); + +set_lcm_register(0xD516,0x01); + +set_lcm_register(0xD517,0x87); + +set_lcm_register(0xD518,0x01); + +set_lcm_register(0xD519,0xB3); + +set_lcm_register(0xD51A,0x01); + +set_lcm_register(0xD51B,0xB6); + +set_lcm_register(0xD51C,0x01); + +set_lcm_register(0xD51D,0xDC); + +set_lcm_register(0xD51E,0x02); + +set_lcm_register(0xD51F,0x04); + + + +set_lcm_register(0xD520,0x02); + +set_lcm_register(0xD521,0x1C); + +set_lcm_register(0xD522,0x02); + +set_lcm_register(0xD523,0x34); + +set_lcm_register(0xD524,0x02); + +set_lcm_register(0xD525,0x4E); + +set_lcm_register(0xD526,0x02); + +set_lcm_register(0xD527,0x8A); + +set_lcm_register(0xD528,0x02); + +set_lcm_register(0xD529,0xC2); + +set_lcm_register(0xD52A,0x03); + +set_lcm_register(0xD52B,0x04); + +set_lcm_register(0xD52C,0x03); + +set_lcm_register(0xD52D,0x2E); + +set_lcm_register(0xD52E,0x03); + +set_lcm_register(0xD52F,0x74); + +set_lcm_register(0xD530,0x03); + +set_lcm_register(0xD531,0xEB); + +set_lcm_register(0xD532,0x03); + +set_lcm_register(0xD533,0xFF); + + + +//Gamma setting Blue Negative + +set_lcm_register(0xD600,0x00); + +set_lcm_register(0xD601,0x00); + +set_lcm_register(0xD602,0x00); + +set_lcm_register(0xD603,0x16); + +set_lcm_register(0xD604,0x00); + +set_lcm_register(0xD605,0x42); + +set_lcm_register(0xD606,0x00); + +set_lcm_register(0xD607,0x61); + +set_lcm_register(0xD608,0x00); + +set_lcm_register(0xD609,0x74); + +set_lcm_register(0xD60A,0x00); + +set_lcm_register(0xD60B,0x97); + +set_lcm_register(0xD60C,0x00); + +set_lcm_register(0xD60D,0xAD); + +set_lcm_register(0xD60E,0x00); + +set_lcm_register(0xD60F,0xDE); + +set_lcm_register(0xD610,0x01); + +set_lcm_register(0xD611,0x00); + +set_lcm_register(0xD612,0x01); + +set_lcm_register(0xD613,0x26); + +set_lcm_register(0xD614,0x01); + +set_lcm_register(0xD615,0x50); + +set_lcm_register(0xD616,0x01); + +set_lcm_register(0xD617,0x87); + +set_lcm_register(0xD618,0x01); + +set_lcm_register(0xD619,0xB3); + +set_lcm_register(0xD61A,0x01); + +set_lcm_register(0xD61B,0xB6); + +set_lcm_register(0xD61C,0x01); + +set_lcm_register(0xD61D,0xDC); + +set_lcm_register(0xD61E,0x02); + +set_lcm_register(0xD61F,0x04); + + + +set_lcm_register(0xD620,0x02); + +set_lcm_register(0xD621,0x1C); + +set_lcm_register(0xD622,0x02); + +set_lcm_register(0xD623,0x34); + +set_lcm_register(0xD624,0x02); + +set_lcm_register(0xD625,0x4E); + +set_lcm_register(0xD626,0x02); + +set_lcm_register(0xD627,0x8A); + +set_lcm_register(0xD628,0x02); + +set_lcm_register(0xD629,0xC2); + +set_lcm_register(0xD62A,0x03); + +set_lcm_register(0xD62B,0x04); + +set_lcm_register(0xD62C,0x03); + +set_lcm_register(0xD62D,0x2E); + +set_lcm_register(0xD62E,0x03); + +set_lcm_register(0xD62F,0x74); + +set_lcm_register(0xD630,0x03); + +set_lcm_register(0xD631,0xEB); + +set_lcm_register(0xD632,0x03); + +set_lcm_register(0xD633,0xFF); + + + + + + + +//set_lcm_register(0xB700,0x00);//Gate EQ + +//set_lcm_register(0xB701,0x00); + + + +//set_lcm_register(0xB800,0x01);//Source EQ + +//set_lcm_register(0xB801,0x05); + +//set_lcm_register(0xB802,0x05); + +//set_lcm_register(0xB803,0x05); + + + +//set_lcm_register(0xFF00,0xAA);//#ENABLE LV3 + +//set_lcm_register(0xFF01,0x55); + +//set_lcm_register(0xFF02,0x25); + +//set_lcm_register(0xFF03,0x01); + +//set_lcm_register(0xB101,0x04); + + + +//set_lcm_register(0x3600,0x80);//set memory data access control + +set_lcm_register(0x3A00,0x77);//set interface pixel format + + + + + + + + + +//#StartUp + +send_ctrl_cmd(0x1100); + +MDELAY(200); + +send_ctrl_cmd(0x2900); + +MDELAY(120); + +send_ctrl_cmd(0x2C00); + +MDELAY(120); + +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + //lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + //lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(150); + send_ctrl_cmd(0x2900); + MDELAY(100); +} +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); + + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_read_data(); //spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_read_data(); //spi_read_data(); + + id = (id1<<8)|id2; + + + return (LCM_ID == id)?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER kd50m14_wvga_nt35510_lcm_drv = +{ + + .name = "kd50m14_wvga_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; + diff --git a/acer_e350_simcom75/lcm/kd50m4_wvga_otm8009a/kd50m4_wvga_otm8009a.c b/acer_e350_simcom75/lcm/kd50m4_wvga_otm8009a/kd50m4_wvga_otm8009a.c new file mode 100644 index 0000000..afea8b9 --- /dev/null +++ b/acer_e350_simcom75/lcm/kd50m4_wvga_otm8009a/kd50m4_wvga_otm8009a.c @@ -0,0 +1,1809 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID 0x40 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + + +static __inline unsigned char spi_get_byte(unsigned int reg) +{ + unsigned int i; + int k; + unsigned char getbyte=0; + + // reg = (CTRL_ID | (reg & 0xFF)); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + SET_LSCE_LOW; + UDELAY(1); + + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (reg & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + reg <<= 1; + } + + UDELAY(2); + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + SET_LSCK_HIGH; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte |= (1 << k); + } + + } + + UDELAY(2); + + SET_LSDA_HIGH; + SET_LSCE_HIGH; + + return getbyte; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xff00); // + send_data_cmd(0x80); + send_ctrl_cmd(0xff01); // enable EXTC + send_data_cmd(0x09); + send_ctrl_cmd(0xff02); // + send_data_cmd(0x01); + + send_ctrl_cmd(0xff80); // enable Orise mode + send_data_cmd(0x80); + send_ctrl_cmd(0xff81); // + send_data_cmd(0x09); + //************************************************************************** + send_ctrl_cmd(0xff03); // enable SPI+I2C cmd2 read + send_data_cmd(0x01); + + send_ctrl_cmd(0xC0B4); // dot Inversion + send_data_cmd(0x00); + + send_ctrl_cmd(0xC580); // Disable auto voltage detecting + send_data_cmd(0x03); + + send_ctrl_cmd(0xC582); // Disable auto voltage detecting + send_data_cmd(0xA3); + + send_ctrl_cmd(0xc590); // pump1 X2 ratio + send_data_cmd(0x96); + + send_ctrl_cmd(0xc591); // pump1 X2 ratio + send_data_cmd(0x0F);//edit by orise FAE2011.12.15 + + send_ctrl_cmd(0xc592); // pump45 + send_data_cmd(0x01); + + send_ctrl_cmd(0xc593); // VRGH/VRGL Setting + send_data_cmd(0x00); + + send_ctrl_cmd(0xc594); // pump12 clk freq(Normal) + send_data_cmd(0x33); + + send_ctrl_cmd(0xC0A3); + send_data_cmd(0x1B); + + send_ctrl_cmd(0xC481); + send_data_cmd(0x04); + + send_ctrl_cmd(0xD800); // GVDD setting + send_data_cmd(0x70); + + send_ctrl_cmd(0xD801); // NGVDD setting + send_data_cmd(0x70); + + send_ctrl_cmd(0xc5B1); + send_data_cmd(0x29); + + send_ctrl_cmd(0xD900); // Vcom setting + send_data_cmd(0x36); + + + //*********************************CE*********************************** + + send_ctrl_cmd(0xD400); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + + + //D5 setting + + + send_ctrl_cmd(0xD500); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + + send_ctrl_cmd(0xD680); + send_data_cmd(0x08); + //*********************************Gamma*********************************** + // Positive + send_ctrl_cmd(0xE100); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE101); + send_data_cmd(0x16); + + send_ctrl_cmd(0xE102); + send_data_cmd(0x17); + + send_ctrl_cmd(0xE103); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE104); + send_data_cmd(0x0B); + + send_ctrl_cmd(0xE105); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE106); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE107); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE108); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE109); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE10A); + send_data_cmd(0x02); + + send_ctrl_cmd(0xE10B); + send_data_cmd(0x06); + + send_ctrl_cmd(0xE10C); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE10D); + send_data_cmd(0x20); + + send_ctrl_cmd(0xE10E); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE10F); + send_data_cmd(0x16); + + + //NEGATIVE + + send_ctrl_cmd(0xE200); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE201); + send_data_cmd(0x16); + + send_ctrl_cmd(0xE202); + send_data_cmd(0x17); + + send_ctrl_cmd(0xE203); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE204); + send_data_cmd(0x0B); + + send_ctrl_cmd(0xE205); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE206); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE207); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE208); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE209); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE20A); + send_data_cmd(0x02); + + send_ctrl_cmd(0xE20B); + send_data_cmd(0x07); + + send_ctrl_cmd(0xE20C); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE20D); + send_data_cmd(0x20); + + send_ctrl_cmd(0xE20E); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE20F); + send_data_cmd(0x16); + + ///////////////////////////////////////////////////////////////////// + + send_ctrl_cmd(0xb3a6); // reg_panel_zinv, reg_panel_zinv_pixel, reg_panel_zinv_odd, reg_panel_zigzag, reg_panel_zigzag_blue, reg_panel_zigzag_shift_r, reg_panel_zigzag_odd + send_data_cmd(0x20); + + send_ctrl_cmd(0xb3a7); // panel_set[0] = 1 + send_data_cmd(0x01); + + send_ctrl_cmd(0xce80);// ce81[7:0] : vst1_shift[7:0] + send_data_cmd(0x85); + send_ctrl_cmd(0xce81);// ce82[7:0] : 0000, vst1_width[3:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xce82);// ce83[7:0] : vst1_tchop[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xce83);// ce84[7:0] : vst2_shift[7:0] + send_data_cmd(0x84); + send_ctrl_cmd(0xce84);// ce85[7:0] : 0000, vst2_width[3:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xce85);// ce86[7:0] : vst2_tchop[7:0] + send_data_cmd(0x00); + + //CEAx : clka1, clka2 + + send_ctrl_cmd(0xcea0);// cea1[7:0] : clka1_width[3:0], clka1_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xcea1);// cea2[7:0] : clka1_shift[7:0] + send_data_cmd(0x04); + send_ctrl_cmd(0xcea2);// cea3[7:0] : clka1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xcea3);// cea4[7:0] : clka1_switch[7:0] + send_data_cmd(0x21); + send_ctrl_cmd(0xcea4);// cea5[7:0] : clka1_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xcea5);// cea6[7:0] : clka1_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xcea6);// cea7[7:0] : clka1_tglue[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xcea7);// cea8[7:0] : clka2_width[3:0], clka2_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xcea8);// cea9[7:0] : clka2_shift[7:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xcea9);// ceaa[7:0] : clka2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceaa);// ceab[7:0] : clka2_switch[7:0] + send_data_cmd(0x22); + send_ctrl_cmd(0xceab);// ceac[7:0] : clka2_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xceac);// cead[7:0] : clka2_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xcead);// ceae[7:0] : clka2_tglue + send_data_cmd(0x00); + +//CEBx : clka3, clka4 + send_ctrl_cmd(0xceb0);// ceb1[7:0] : clka3_width[3:0], clka3_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xceb1);// ceb2[7:0] : clka3_shift[7:0] + send_data_cmd(0x02); + send_ctrl_cmd(0xceb2);// ceb3[7:0] : clka3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceb3);// ceb4[7:0] : clka3_switch[7:0] + send_data_cmd(0x23); + send_ctrl_cmd(0xceb4);// ceb5[7:0] : clka3_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xceb5);// ceb6[7:0] : clka3_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xceb6);// ceb7[7:0] : clka3_tglue[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xceb7);// ceb8[7:0] : clka4_width[3:0], clka2_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xceb8);// ceb9[7:0] : clka4_shift[7:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xceb9);// ceba[7:0] : clka4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceba);// cebb[7:0] : clka4_switch[7:0] + send_data_cmd(0x24); + send_ctrl_cmd(0xcebb);// cebc[7:0] : clka4_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xcebc);// cebd[7:0] : clka4_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xcebd);// cebe[7:0] : clka4_tglue + send_data_cmd(0x00); + + +//CFCx : + send_ctrl_cmd(0xcfc0);// cfc1[7:0] : eclk_normal_width[7:0] + send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc1);// cfc2[7:0] : eclk_partial_width[7:0] send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc2);// cfc3[7:0] : all_normal_tchop[7:0] send_data_cmd(0x20); + + send_ctrl_cmd(0xcfc3);// cfc4[7:0] : all_partial_tchop[7:0] send_data_cmd(0x20); + + send_ctrl_cmd(0xcfc4);// cfc5[7:0] : eclk1_follow[3:0], eclk2_follow[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc5);// cfc6[7:0] : eclk3_follow[3:0], eclk4_follow[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc6);// cfc7[7:0] : 00, vstmask, vendmask, 00, dir1, dir2 (0=VGL, 1=VGH) send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc7);// cfc8[7:0] : reg_goa_gnd_opt, reg_goa_dpgm_tail_set, reg_goa_f_gating_en, reg_goa_f_odd_gating, toggle_mod1, 2, 3, 4 + send_data_cmd(0x00); // GND OPT1 (00-->80 2011/10/28) + + send_ctrl_cmd(0xcfc8);// cfc9[7:0] : duty_block[3:0], DGPM[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc9);// cfca[7:0] : reg_goa_gnd_period[7:0] send_data_cmd(0x00); // Gate PCH (CLK base) (00-->0a 2011/10/28) + +//CFDx : + send_ctrl_cmd(0xcfd0);// cfd1[7:0] : 0000000, reg_goa_frame_odd_high + send_data_cmd(0x00); + + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- + +// CB8x + send_ctrl_cmd(0xcb80);//cb81[7:0] : signal mode setting of sig4, sig3, sig2, sig1 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb81);//cb82[7:0] : signal mode setting of sig8, sig7, sig6, sig5 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb82);//cb83[7:0] : signal mode setting of sig12, sig11, sig10, sig9 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb83);//cb84[7:0] : signal mode setting of sig16, sig15, sig14, sig13 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb84);//cb85[7:0] : signal mode setting of sig20, sig19, sig18, sig17 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb85);//cb86[7:0] : signal mode setting of sig24, sig23, sig22, sig21 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb86);//cb87[7:0] : signal mode setting of sig28, sig27, sig26, sig25 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb87);//cb88[7:0] : signal mode setting of sig32, sig31, sig30, sig29 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb88);//cb89[7:0] : signal mode setting of sig36, sig35, sig34, sig33 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb89);//cb8a[7:0] : signal mode setting of sig40, sig39, sig38, sig37 ( sleep in ) + send_data_cmd(0x00); + +// cb9x + send_ctrl_cmd(0xcb90);//cb91[7:0] : enmode L-byte of sig1 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb91);//cb92[7:0] : enmode L-byte of sig2 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb92);//cb93[7:0] : enmode L-byte of sig3 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb93);//cb94[7:0] : enmode L-byte of sig4 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb94);//cb95[7:0] : enmode L-byte of sig5 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb95);//cb96[7:0] : enmode L-byte of sig6 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb96);//cb97[7:0] : enmode L-byte of sig7 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb97);//cb98[7:0] : enmode L-byte of sig8 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb98);//cb99[7:0] : enmode L-byte of sig9 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb99);//cb9a[7:0] : enmode L-byte of sig10 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9a);//cb9b[7:0] : enmode L-byte of sig11 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9b);//cb9c[7:0] : enmode L-byte of sig12 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9c);//cb9d[7:0] : enmode L-byte of sig13 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9d);//cb9e[7:0] : enmode L-byte of sig14 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9e);//cb9f[7:0] : enmode L-byte of sig15 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbax + send_ctrl_cmd(0xcba0);//cba1[7:0] : enmode L-byte of sig16 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba1);//cba2[7:0] : enmode L-byte of sig17 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba2);//cba3[7:0] : enmode L-byte of sig18 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba3);//cba4[7:0] : enmode L-byte of sig19 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba4);//cba5[7:0] : enmode L-byte of sig20 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba5);//cba6[7:0] : enmode L-byte of sig21 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba6);//cba7[7:0] : enmode L-byte of sig22 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba7);//cba8[7:0] : enmode L-byte of sig23 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba8);//cba9[7:0] : enmode L-byte of sig24 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba9);//cbaa[7:0] : enmode L-byte of sig25 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbaa);//cbab[7:0] : enmode L-byte of sig26 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbab);//cbac[7:0] : enmode L-byte of sig27 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbac);//cbad[7:0] : enmode L-byte of sig28 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbad);//cbae[7:0] : enmode L-byte of sig29 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbae);//cbaf[7:0] : enmode L-byte of sig30 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbbx + send_ctrl_cmd(0xcbb0);//cbb1[7:0] : enmode L-byte of sig31 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb1);//cbb2[7:0] : enmode L-byte of sig32 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb2);//cbb3[7:0] : enmode L-byte of sig33 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb3);//cbb4[7:0] : enmode L-byte of sig34 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb4);//cbb5[7:0] : enmode L-byte of sig35 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb5);//cbb6[7:0] : enmode L-byte of sig36 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb6);//cbb7[7:0] : enmode L-byte of sig37 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb7);//cbb8[7:0] : enmode L-byte of sig38 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb8);//cbb9[7:0] : enmode L-byte of sig39 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb9);//cbba[7:0] : enmode L-byte of sig40 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbcx + send_ctrl_cmd(0xcbc0);//cbc1[7:0] : enmode H-byte of sig1 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc1);//cbc2[7:0] : enmode H-byte of sig2 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc2);//cbc3[7:0] : enmode H-byte of sig3 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc3);//cbc4[7:0] : enmode H-byte of sig4 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc4);//cbc5[7:0] : enmode H-byte of sig5 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc5);//cbc6[7:0] : enmode H-byte of sig6 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc6);//cbc7[7:0] : enmode H-byte of sig7 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc7);//cbc8[7:0] : enmode H-byte of sig8 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc8);//cbc9[7:0] : enmode H-byte of sig9 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc9);//cbca[7:0] : enmode H-byte of sig10 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbca);//cbcb[7:0] : enmode H-byte of sig11 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcb);//cbcc[7:0] : enmode H-byte of sig12 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcc);//cbcd[7:0] : enmode H-byte of sig13 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcd);//cbce[7:0] : enmode H-byte of sig14 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbce);//cbcf[7:0] : enmode H-byte of sig15 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + +// cbdx + send_ctrl_cmd(0xcbd0);//cbd1[7:0] : enmode H-byte of sig16 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd1);//cbd2[7:0] : enmode H-byte of sig17 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd2);//cbd3[7:0] : enmode H-byte of sig18 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd3);//cbd4[7:0] : enmode H-byte of sig19 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd4);//cbd5[7:0] : enmode H-byte of sig20 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd5);//cbd6[7:0] : enmode H-byte of sig21 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd6);//cbd7[7:0] : enmode H-byte of sig22 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd7);//cbd8[7:0] : enmode H-byte of sig23 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd8);//cbd9[7:0] : enmode H-byte of sig24 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd9);//cbda[7:0] : enmode H-byte of sig25 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbda);//cbdb[7:0] : enmode H-byte of sig26 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbdb);//cbdc[7:0] : enmode H-byte of sig27 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbdc);//cbdd[7:0] : enmode H-byte of sig28 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbdd);//cbde[7:0] : enmode H-byte of sig29 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbde);//cbdf[7:0] : enmode H-byte of sig30 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + +// cbex + send_ctrl_cmd(0xcbe0);//cbe1[7:0] : enmode H-byte of sig31 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe1);//cbe2[7:0] : enmode H-byte of sig32 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe2);//cbe3[7:0] : enmode H-byte of sig33 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe3);//cbe4[7:0] : enmode H-byte of sig34 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe4);//cbe5[7:0] : enmode H-byte of sig35 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe5);//cbe6[7:0] : enmode H-byte of sig36 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe6);//cbe7[7:0] : enmode H-byte of sig37 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe7);//cbe8[7:0] : enmode H-byte of sig38 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe8);//cbe9[7:0] : enmode H-byte of sig39 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe9);//cbea[7:0] : enmode H-byte of sig40 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + + +// cbfx + send_ctrl_cmd(0xcbf0);//cbf1[7:0] : lvd enmode of ( sig4, sig3, sig2, sig1) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf1);//cbf2[7:0] : lvd enmode of ( sig8, sig7, sig6, sig5) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf2);//cbf3[7:0] : lvd enmode of (sig12, sig11, sig10, sig9) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf3);//cbf4[7:0] : lvd enmode of (sig16, sig15, sig14, sig13) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf4);//cbf5[7:0] : lvd enmode of (sig20, sig19, sig18, sig17) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf5);//cbf6[7:0] : lvd enmode of (sig24, sig23, sig22, sig21) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf6);//cbf7[7:0] : lvd enmode of (sig28, sig27, sig26, sig25) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf7);//cbf8[7:0] : lvd enmode of (sig32, sig31, sig30, sig29) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf8);//cbf9[7:0] : lvd enmode of (sig36, sig35, sig34, sig33) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf9);//cbfa[7:0] : lvd enmode of (sig40, sig39, sig38, sig37) + send_data_cmd(0xFF); + +// cc8x + send_ctrl_cmd(0xcc80);//cc81[7:0] : reg setting for signal01 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc81);//cc82[7:0] : reg setting for signal02 selection with u2d mode + send_data_cmd(0x26); + send_ctrl_cmd(0xcc82);//cc83[7:0] : reg setting for signal03 selection with u2d mode + send_data_cmd(0x09); + send_ctrl_cmd(0xcc83);//cc84[7:0] : reg setting for signal04 selection with u2d mode + send_data_cmd(0x0B); + send_ctrl_cmd(0xcc84);//cc85[7:0] : reg setting for signal05 selection with u2d mode + send_data_cmd(0x01); + send_ctrl_cmd(0xcc85);//cc86[7:0] : reg setting for signal06 selection with u2d mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcc86);//cc87[7:0] : reg setting for signal07 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc87);//cc88[7:0] : reg setting for signal08 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc88);//cc89[7:0] : reg setting for signal09 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc89);//cc8a[7:0] : reg setting for signal10 selection with u2d mode + send_data_cmd(0x00); + +// cc9x + send_ctrl_cmd(0xcc90);//cc91[7:0] : reg setting for signal11 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc91);//cc92[7:0] : reg setting for signal12 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc92);//cc93[7:0] : reg setting for signal13 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc93);//cc94[7:0] : reg setting for signal14 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc94);//cc95[7:0] : reg setting for signal15 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc95);//cc96[7:0] : reg setting for signal16 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc96);//cc97[7:0] : reg setting for signal17 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc97);//cc98[7:0] : reg setting for signal18 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc98);//cc99[7:0] : reg setting for signal19 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc99);//cc9a[7:0] : reg setting for signal20 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc9a);//cc9b[7:0] : reg setting for signal21 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc9b);//cc9c[7:0] : reg setting for signal22 selection with u2d mode + send_data_cmd(0x26); + send_ctrl_cmd(0xcc9c);//cc9d[7:0] : reg setting for signal23 selection with u2d mode + send_data_cmd(0x0A); + send_ctrl_cmd(0xcc9d);//cc9e[7:0] : reg setting for signal24 selection with u2d mode + send_data_cmd(0x0C); + send_ctrl_cmd(0xcc9e);//cc9f[7:0] : reg setting for signal25 selection with u2d mode + send_data_cmd(0x02); + +// ccax + send_ctrl_cmd(0xcca0);//cca1[7:0] : reg setting for signal26 selection with u2d mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcca1);//cca2[7:0] : reg setting for signal27 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca2);//cca3[7:0] : reg setting for signal28 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca3);//cca4[7:0] : reg setting for signal29 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca4);//cca5[7:0] : reg setting for signal20 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca5);//cca6[7:0] : reg setting for signal31 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca6);//cca7[7:0] : reg setting for signal32 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca7);//cca8[7:0] : reg setting for signal33 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca8);//cca9[7:0] : reg setting for signal34 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca9);//ccaa[7:0] : reg setting for signal35 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccaa);//ccab[7:0] : reg setting for signal36 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccab);//ccac[7:0] : reg setting for signal37 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccac);//ccad[7:0] : reg setting for signal38 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccad);//ccae[7:0] : reg setting for signal39 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccae);//ccaf[7:0] : reg setting for signal40 selection with u2d mode + send_data_cmd(0x00); + +// ccbx + send_ctrl_cmd(0xccb0);//ccb1[7:0] : reg setting for signal01 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb1);//ccb2[7:0] : reg setting for signal02 selection with d2u mode + send_data_cmd(0x25); + send_ctrl_cmd(0xccb2);//ccb3[7:0] : reg setting for signal03 selection with d2u mode + send_data_cmd(0x0C); + send_ctrl_cmd(0xccb3);//ccb4[7:0] : reg setting for signal04 selection with d2u mode + send_data_cmd(0x0A); + send_ctrl_cmd(0xccb4);//ccb5[7:0] : reg setting for signal05 selection with d2u mode + send_data_cmd(0x02); + send_ctrl_cmd(0xccb5);//ccb6[7:0] : reg setting for signal06 selection with d2u mode + send_data_cmd(0x26); + send_ctrl_cmd(0xccb6);//ccb7[7:0] : reg setting for signal07 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb7);//ccb8[7:0] : reg setting for signal08 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb8);//ccb9[7:0] : reg setting for signal09 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb9);//ccba[7:0] : reg setting for signal10 selection with d2u mode + send_data_cmd(0x00); + +// cccx + send_ctrl_cmd(0xccc0);//ccc1[7:0] : reg setting for signal11 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc1);//ccc2[7:0] : reg setting for signal12 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc2);//ccc3[7:0] : reg setting for signal13 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc3);//ccc4[7:0] : reg setting for signal14 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc4);//ccc5[7:0] : reg setting for signal15 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc5);//ccc6[7:0] : reg setting for signal16 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc6);//ccc7[7:0] : reg setting for signal17 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc7);//ccc8[7:0] : reg setting for signal18 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc8);//ccc9[7:0] : reg setting for signal19 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc9);//ccca[7:0] : reg setting for signal20 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccca);//cccb[7:0] : reg setting for signal21 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcccb);//cccc[7:0] : reg setting for signal22 selection with d2u mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcccc);//cccd[7:0] : reg setting for signal23 selection with d2u mode + send_data_cmd(0x0B); + send_ctrl_cmd(0xcccd);//ccce[7:0] : reg setting for signal24 selection with d2u mode + send_data_cmd(0x09); + send_ctrl_cmd(0xccce);//cccf[7:0] : reg setting for signal25 selection with d2u mode + send_data_cmd(0x01); + +// ccdx + send_ctrl_cmd(0xccd0);//ccd1[7:0] : reg setting for signal26 selection with d2u mode + send_data_cmd(0x26); + send_ctrl_cmd(0xccd1);//ccd2[7:0] : reg setting for signal27 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd2);//ccd3[7:0] : reg setting for signal28 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd3);//ccd4[7:0] : reg setting for signal29 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd4);//ccd5[7:0] : reg setting for signal30 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd5);//ccd6[7:0] : reg setting for signal31 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd6);//ccd7[7:0] : reg setting for signal32 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd7);//ccd8[7:0] : reg setting for signal33 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd8);//ccd9[7:0] : reg setting for signal34 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd9);//ccda[7:0] : reg setting for signal35 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccda);//ccdb[7:0] : reg setting for signal36 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdb);//ccdc[7:0] : reg setting for signal37 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdc);//ccdd[7:0] : reg setting for signal38 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdd);//ccde[7:0] : reg setting for signal39 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccde);//ccdf[7:0] : reg setting for signal40 selection with d2u mode + send_data_cmd(0x00); + MDELAY(12); + + send_ctrl_cmd(0x3600); + send_data_cmd(0x00); + + send_ctrl_cmd(0xc181); + send_data_cmd(0x66); + + send_ctrl_cmd(0xc5B1); + send_data_cmd(0x29); + + send_ctrl_cmd(0xb282); + send_data_cmd(0x20); + + send_ctrl_cmd(0xc082); + send_data_cmd(0x00); + + send_ctrl_cmd(0xc083); + send_data_cmd(0x16); + + send_ctrl_cmd(0xc084); + send_data_cmd(0x08); + + send_ctrl_cmd(0xc1A1); + send_data_cmd(0x08); + + send_ctrl_cmd(0xCFC7); + send_data_cmd(0x02); + + send_ctrl_cmd(0x1100); + // printf(" Sleep out \n"); + MDELAY(150); + + send_ctrl_cmd(0x2900); + //printf(" Display on \n"); + MDELAY(50); +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + // lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0);//input + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, 0); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(200); + + send_ctrl_cmd(0xda00); + id = spi_get_byte(0xc0); //spi_read_data(); + MDELAY(20); + +#ifdef BUILD_UBOOT + printf("lcd_id=%x \r\n",id); +#else + printk("lcd_id=%x \r\n",id); +#endif + + return (LCM_ID == id)?1:0; +} + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(100); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER kd50m4_wvga_otm8009a_lcm_drv = +{ + + .name = "kd50m4_wvga_otm8009a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id, +}; diff --git a/acer_e350_simcom75/lcm/lg4571/lg4571.c b/acer_e350_simcom75/lcm/lg4571/lg4571.c new file mode 100644 index 0000000..e787572 --- /dev/null +++ b/acer_e350_simcom75/lcm/lg4571/lg4571.c @@ -0,0 +1,401 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/acer_e350_simcom75/lcm/lm050amybo1j_wvga_rm68120/lm050amybo1j_wvga_rm68120.c b/acer_e350_simcom75/lcm/lm050amybo1j_wvga_rm68120/lm050amybo1j_wvga_rm68120.c new file mode 100644 index 0000000..95079ba --- /dev/null +++ b/acer_e350_simcom75/lcm/lm050amybo1j_wvga_rm68120/lm050amybo1j_wvga_rm68120.c @@ -0,0 +1,847 @@ + +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + + +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x2081 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_read_data(void) +{ + unsigned int i; + int k=0; + unsigned int getbyte1=0; + unsigned int data=0; + +#ifdef BUILD_UBOOT + printf("spi_read_data \r\n"); +#endif + + data = 0xc0; + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + SET_LA0_INPUT; + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 7)) + { + SET_LSDA_HIGH; + } + else + { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } +#if 0 + for(i=8;i>0;i--) + { + SET_LSCK_LOW; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#endif + UDELAY(5); + for (k = 7; k >=0; k--) + { + SET_LSCK_LOW; + if (GET_LSA0_BIT) + { + getbyte1 |= (1 << k); + } + + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#ifdef BUILD_UBOOT + printf("getbyte1=0x%x \r\n",getbyte1); +#endif + SET_LSDA_HIGH; + SET_LSCE_HIGH; + return getbyte1; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +//5.0NEW AUO+RM68120 TIGONG 20120417 +set_lcm_register(0XF000,0X55); +set_lcm_register(0XF001,0XAA); +set_lcm_register(0XF002,0X52); +set_lcm_register(0XF003,0X08); +set_lcm_register(0XF004,0X01); + +//GAMMA RED +set_lcm_register(0XD100,0X00); +set_lcm_register(0XD101,0X00); +set_lcm_register(0XD102,0X48); +set_lcm_register(0XD103,0X8B); +set_lcm_register(0XD104,0XB5); +set_lcm_register(0XD105,0X54); +set_lcm_register(0XD106,0XD5); +set_lcm_register(0XD107,0X04); +set_lcm_register(0XD108,0X28); +set_lcm_register(0XD109,0X5E); +set_lcm_register(0XD10A,0X55); +set_lcm_register(0XD10B,0X86); +set_lcm_register(0XD10C,0XA7); +set_lcm_register(0XD10D,0XC2); +set_lcm_register(0XD10E,0XDC); +set_lcm_register(0XD10F,0XA9); +set_lcm_register(0XD110,0XF2); +set_lcm_register(0XD111,0X05); +set_lcm_register(0XD112,0X17); +set_lcm_register(0XD113,0X28); +set_lcm_register(0XD114,0XAA); +set_lcm_register(0XD115,0X38); +set_lcm_register(0XD116,0X46); +set_lcm_register(0XD117,0X55); +set_lcm_register(0XD118,0X63); +set_lcm_register(0XD119,0XAA); +set_lcm_register(0XD11A,0X70); +set_lcm_register(0XD11B,0X71); +set_lcm_register(0XD11C,0X7E); +set_lcm_register(0XD11D,0X8B); +set_lcm_register(0XD11E,0XAA); +set_lcm_register(0XD11F,0X97); +set_lcm_register(0XD120,0XA3); +set_lcm_register(0XD121,0XB0); +set_lcm_register(0XD122,0XBC); +set_lcm_register(0XD123,0XAA); +set_lcm_register(0XD124,0XC8); +set_lcm_register(0XD125,0XD4); +set_lcm_register(0XD126,0XE0); +set_lcm_register(0XD127,0XEE); +set_lcm_register(0XD128,0XFE); +set_lcm_register(0XD129,0XFD); +set_lcm_register(0XD12A,0X0E); +set_lcm_register(0XD12B,0X25); +set_lcm_register(0XD12C,0X4B); +set_lcm_register(0XD12D,0XFF); +set_lcm_register(0XD12E,0X69); +set_lcm_register(0XD12F,0X97); +set_lcm_register(0XD130,0XB7); +set_lcm_register(0XD131,0XDD); +set_lcm_register(0XD132,0X0F); +set_lcm_register(0XD133,0XFB); +set_lcm_register(0XD134,0XFF); +//GAMMA GREEN +set_lcm_register(0XD200,0X00); +set_lcm_register(0XD201,0X00); +set_lcm_register(0XD202,0X48); +set_lcm_register(0XD203,0X8B); +set_lcm_register(0XD204,0XB5); +set_lcm_register(0XD205,0X54); +set_lcm_register(0XD206,0XD5); +set_lcm_register(0XD207,0X04); +set_lcm_register(0XD208,0X28); +set_lcm_register(0XD209,0X5E); +set_lcm_register(0XD20A,0X55); +set_lcm_register(0XD20B,0X86); +set_lcm_register(0XD20C,0XA7); +set_lcm_register(0XD20D,0XC2); +set_lcm_register(0XD20E,0XDC); +set_lcm_register(0XD20F,0XA9); +set_lcm_register(0XD210,0XF2); +set_lcm_register(0XD211,0X05); +set_lcm_register(0XD212,0X17); +set_lcm_register(0XD213,0X28); +set_lcm_register(0XD214,0XAA); +set_lcm_register(0XD215,0X38); +set_lcm_register(0XD216,0X46); +set_lcm_register(0XD217,0X55); +set_lcm_register(0XD218,0X63); +set_lcm_register(0XD219,0XAA); +set_lcm_register(0XD21A,0X70); +set_lcm_register(0XD21B,0X71); +set_lcm_register(0XD21C,0X7E); +set_lcm_register(0XD21D,0X8B); +set_lcm_register(0XD21E,0XAA); +set_lcm_register(0XD21F,0X97); +set_lcm_register(0XD220,0XA3); +set_lcm_register(0XD221,0XB0); +set_lcm_register(0XD222,0XBC); +set_lcm_register(0XD223,0XAA); +set_lcm_register(0XD224,0XC8); +set_lcm_register(0XD225,0XD4); +set_lcm_register(0XD226,0XE0); +set_lcm_register(0XD227,0XEE); +set_lcm_register(0XD228,0XFE); +set_lcm_register(0XD229,0XFD); +set_lcm_register(0XD22A,0X0E); +set_lcm_register(0XD22B,0X25); +set_lcm_register(0XD22C,0X4B); +set_lcm_register(0XD22D,0XFF); +set_lcm_register(0XD22E,0X69); +set_lcm_register(0XD22F,0X97); +set_lcm_register(0XD230,0XB7); +set_lcm_register(0XD231,0XDD); +set_lcm_register(0XD232,0X0F); +set_lcm_register(0XD233,0XFB); +set_lcm_register(0XD234,0XFF); +//GAMMA SETT BLUE +set_lcm_register(0XD300,0X00); +set_lcm_register(0XD301,0X00); +set_lcm_register(0XD302,0X48); +set_lcm_register(0XD303,0X8B); +set_lcm_register(0XD304,0XB5); +set_lcm_register(0XD305,0X54); +set_lcm_register(0XD306,0XD5); +set_lcm_register(0XD307,0X04); +set_lcm_register(0XD308,0X28); +set_lcm_register(0XD309,0X5E); +set_lcm_register(0XD30A,0X55); +set_lcm_register(0XD30B,0X86); +set_lcm_register(0XD30C,0XA7); +set_lcm_register(0XD30D,0XC2); +set_lcm_register(0XD30E,0XDC); +set_lcm_register(0XD30F,0XA9); +set_lcm_register(0XD310,0XF2); +set_lcm_register(0XD311,0X05); +set_lcm_register(0XD312,0X17); +set_lcm_register(0XD313,0X28); +set_lcm_register(0XD314,0XAA); +set_lcm_register(0XD315,0X38); +set_lcm_register(0XD316,0X46); +set_lcm_register(0XD317,0X55); +set_lcm_register(0XD318,0X63); +set_lcm_register(0XD319,0XAA); +set_lcm_register(0XD31A,0X70); +set_lcm_register(0XD31B,0X71); +set_lcm_register(0XD31C,0X7E); +set_lcm_register(0XD31D,0X8B); +set_lcm_register(0XD31E,0XAA); +set_lcm_register(0XD31F,0X97); +set_lcm_register(0XD320,0XA3); +set_lcm_register(0XD321,0XB0); +set_lcm_register(0XD322,0XBC); +set_lcm_register(0XD323,0XAA); +set_lcm_register(0XD324,0XC8); +set_lcm_register(0XD325,0XD4); +set_lcm_register(0XD326,0XE0); +set_lcm_register(0XD327,0XEE); +set_lcm_register(0XD328,0XFE); +set_lcm_register(0XD329,0XFD); +set_lcm_register(0XD32A,0X0E); +set_lcm_register(0XD32B,0X25); +set_lcm_register(0XD32C,0X4B); +set_lcm_register(0XD32D,0XFF); +set_lcm_register(0XD32E,0X69); +set_lcm_register(0XD32F,0X97); +set_lcm_register(0XD330,0XB7); +set_lcm_register(0XD331,0XDD); +set_lcm_register(0XD332,0X0F); +set_lcm_register(0XD333,0XFB); +set_lcm_register(0XD334,0XFF); + +//GAMMA SET RED +set_lcm_register(0XD400,0X00); +set_lcm_register(0XD401,0X00); +set_lcm_register(0XD402,0X48); +set_lcm_register(0XD403,0X8B); +set_lcm_register(0XD404,0XB5); +set_lcm_register(0XD405,0X54); +set_lcm_register(0XD406,0XD5); +set_lcm_register(0XD407,0X04); +set_lcm_register(0XD408,0X28); +set_lcm_register(0XD409,0X5E); +set_lcm_register(0XD40A,0X55); +set_lcm_register(0XD40B,0X86); +set_lcm_register(0XD40C,0XA7); +set_lcm_register(0XD40D,0XC2); +set_lcm_register(0XD40E,0XDC); +set_lcm_register(0XD40F,0XA9); +set_lcm_register(0XD410,0XF2); +set_lcm_register(0XD411,0X05); +set_lcm_register(0XD412,0X17); +set_lcm_register(0XD413,0X28); +set_lcm_register(0XD414,0XAA); +set_lcm_register(0XD415,0X38); +set_lcm_register(0XD416,0X46); +set_lcm_register(0XD417,0X55); +set_lcm_register(0XD418,0X63); +set_lcm_register(0XD419,0XAA); +set_lcm_register(0XD41A,0X70); +set_lcm_register(0XD41B,0X71); +set_lcm_register(0XD41C,0X7E); +set_lcm_register(0XD41D,0X8B); +set_lcm_register(0XD41E,0XAA); +set_lcm_register(0XD41F,0X97); +set_lcm_register(0XD420,0XA3); +set_lcm_register(0XD421,0XB0); +set_lcm_register(0XD422,0XBC); +set_lcm_register(0XD423,0XAA); +set_lcm_register(0XD424,0XC8); +set_lcm_register(0XD425,0XD4); +set_lcm_register(0XD426,0XE0); +set_lcm_register(0XD427,0XEE); +set_lcm_register(0XD428,0XFE); +set_lcm_register(0XD429,0XFD); +set_lcm_register(0XD42A,0X0E); +set_lcm_register(0XD42B,0X25); +set_lcm_register(0XD42C,0X4B); +set_lcm_register(0XD42D,0XFF); +set_lcm_register(0XD42E,0X69); +set_lcm_register(0XD42F,0X97); +set_lcm_register(0XD430,0XB7); +set_lcm_register(0XD431,0XDD); +set_lcm_register(0XD432,0X0F); +set_lcm_register(0XD433,0XFB); +set_lcm_register(0XD434,0XFF); +//GAMMA SET GREEN +set_lcm_register(0XD500,0X00); +set_lcm_register(0XD501,0X00); +set_lcm_register(0XD502,0X48); +set_lcm_register(0XD503,0X8B); +set_lcm_register(0XD504,0XB5); +set_lcm_register(0XD505,0X54); +set_lcm_register(0XD506,0XD5); +set_lcm_register(0XD507,0X04); +set_lcm_register(0XD508,0X28); +set_lcm_register(0XD509,0X5E); +set_lcm_register(0XD50A,0X55); +set_lcm_register(0XD50B,0X86); +set_lcm_register(0XD50C,0XA7); +set_lcm_register(0XD50D,0XC2); +set_lcm_register(0XD50E,0XDC); +set_lcm_register(0XD50F,0XA9); +set_lcm_register(0XD510,0XF2); +set_lcm_register(0XD511,0X05); +set_lcm_register(0XD512,0X17); +set_lcm_register(0XD513,0X28); +set_lcm_register(0XD514,0XAA); +set_lcm_register(0XD515,0X38); +set_lcm_register(0XD516,0X46); +set_lcm_register(0XD517,0X55); +set_lcm_register(0XD518,0X63); +set_lcm_register(0XD519,0XAA); +set_lcm_register(0XD51A,0X70); +set_lcm_register(0XD51B,0X71); +set_lcm_register(0XD51C,0X7E); +set_lcm_register(0XD51D,0X8B); +set_lcm_register(0XD51E,0XAA); +set_lcm_register(0XD51F,0X97); +set_lcm_register(0XD520,0XA3); +set_lcm_register(0XD521,0XB0); +set_lcm_register(0XD522,0XBC); +set_lcm_register(0XD523,0XAA); +set_lcm_register(0XD524,0XC8); +set_lcm_register(0XD525,0XD4); +set_lcm_register(0XD526,0XE0); +set_lcm_register(0XD527,0XEE); +set_lcm_register(0XD528,0XFE); +set_lcm_register(0XD529,0XFD); +set_lcm_register(0XD52A,0X0E); +set_lcm_register(0XD52B,0X25); +set_lcm_register(0XD52C,0X4B); +set_lcm_register(0XD52D,0XFF); +set_lcm_register(0XD52E,0X69); +set_lcm_register(0XD52F,0X97); +set_lcm_register(0XD530,0XB7); +set_lcm_register(0XD531,0XDD); +set_lcm_register(0XD532,0X0F); +set_lcm_register(0XD533,0XFB); +set_lcm_register(0XD534,0XFF); + +//GAMMA SET BLUE +set_lcm_register(0XD600,0X00); +set_lcm_register(0XD601,0X00); +set_lcm_register(0XD602,0X48); +set_lcm_register(0XD603,0X8B); +set_lcm_register(0XD604,0XB5); +set_lcm_register(0XD605,0X54); +set_lcm_register(0XD606,0XD5); +set_lcm_register(0XD607,0X04); +set_lcm_register(0XD608,0X28); +set_lcm_register(0XD609,0X5E); +set_lcm_register(0XD60A,0X55); +set_lcm_register(0XD60B,0X86); +set_lcm_register(0XD60C,0XA7); +set_lcm_register(0XD60D,0XC2); +set_lcm_register(0XD60E,0XDC); +set_lcm_register(0XD60F,0XA9); +set_lcm_register(0XD610,0XF2); +set_lcm_register(0XD611,0X05); +set_lcm_register(0XD612,0X17); +set_lcm_register(0XD613,0X28); +set_lcm_register(0XD614,0XAA); +set_lcm_register(0XD615,0X38); +set_lcm_register(0XD616,0X46); +set_lcm_register(0XD617,0X55); +set_lcm_register(0XD618,0X63); +set_lcm_register(0XD619,0XAA); +set_lcm_register(0XD61A,0X70); +set_lcm_register(0XD61B,0X71); +set_lcm_register(0XD61C,0X7E); +set_lcm_register(0XD61D,0X8B); +set_lcm_register(0XD61E,0XAA); +set_lcm_register(0XD61F,0X97); +set_lcm_register(0XD620,0XA3); +set_lcm_register(0XD621,0XB0); +set_lcm_register(0XD622,0XBC); +set_lcm_register(0XD623,0XAA); +set_lcm_register(0XD624,0XC8); +set_lcm_register(0XD625,0XD4); +set_lcm_register(0XD626,0XE0); +set_lcm_register(0XD627,0XEE); +set_lcm_register(0XD628,0XFE); +set_lcm_register(0XD629,0XFD); +set_lcm_register(0XD62A,0X0E); +set_lcm_register(0XD62B,0X25); +set_lcm_register(0XD62C,0X4B); +set_lcm_register(0XD62D,0XFF); +set_lcm_register(0XD62E,0X69); +set_lcm_register(0XD62F,0X97); +set_lcm_register(0XD630,0XB7); +set_lcm_register(0XD631,0XDD); +set_lcm_register(0XD632,0X0F); +set_lcm_register(0XD633,0XFB); +set_lcm_register(0XD634,0XFF); +//GAMMA SET END + + +set_lcm_register(0XB000,0X00); +set_lcm_register(0XB001,0X00); +set_lcm_register(0XB002,0X00); +set_lcm_register(0XB100,0X05); +set_lcm_register(0XB101,0X05); +set_lcm_register(0XB102,0X05); +set_lcm_register(0XB600,0X44); +set_lcm_register(0XB601,0X44); +set_lcm_register(0XB602,0X44); +set_lcm_register(0XB700,0X34); +set_lcm_register(0XB701,0X34); +set_lcm_register(0XB702,0X34); +set_lcm_register(0XB800,0X24); +set_lcm_register(0XB801,0X24); +set_lcm_register(0XB802,0X24); +set_lcm_register(0XB900,0X34); +set_lcm_register(0XB901,0X34); +set_lcm_register(0XB902,0X34); +set_lcm_register(0XBA00,0X14); +set_lcm_register(0XBA01,0X14); +set_lcm_register(0XBA02,0X14); +set_lcm_register(0XBF00,0X01); +set_lcm_register(0XB300,0X07); +set_lcm_register(0XB301,0X07); +set_lcm_register(0XB302,0X07); +set_lcm_register(0XB900,0X25); +set_lcm_register(0XB901,0X25); +set_lcm_register(0XB902,0X25); +set_lcm_register(0XBC00,0X00); +set_lcm_register(0XBC01,0X90);//A0 90 A8 +set_lcm_register(0XBC02,0X61);//3A 61 00 +set_lcm_register(0XBD00,0X00); +set_lcm_register(0XBD01,0X90);//A0 +set_lcm_register(0XBD02,0X61);//3A +set_lcm_register(0XBE00,0X00); +set_lcm_register(0XBE01,0X8F);//8e +set_lcm_register(0XF000,0X55); +set_lcm_register(0XF001,0XAA); +set_lcm_register(0XF002,0X52); +set_lcm_register(0XF003,0X08); +set_lcm_register(0XF004,0X00); +set_lcm_register(0XB400,0X10); +set_lcm_register(0XB600,0X02); +set_lcm_register(0XB100,0XCC); +set_lcm_register(0XB700,0X22); +set_lcm_register(0XB701,0X22); +set_lcm_register(0XC80B,0X2A); +set_lcm_register(0XC80C,0X2A); +set_lcm_register(0XC80F,0X2A); +set_lcm_register(0XC810,0X2A); +set_lcm_register(0XB800,0X01); +set_lcm_register(0XB801,0X03); +set_lcm_register(0XB802,0X03); +set_lcm_register(0XB803,0X03); +set_lcm_register(0XBC00,0X05);//05 +set_lcm_register(0XBC01,0X05); +set_lcm_register(0XBC02,0X05); +set_lcm_register(0XD000,0X01); +set_lcm_register(0XBA00,0X01); +set_lcm_register(0XBD02,0X07); +set_lcm_register(0XBD03,0X31); +set_lcm_register(0XBE02,0X07); +set_lcm_register(0XBE03,0X31); +set_lcm_register(0XBF02,0X07); +set_lcm_register(0XBF03,0X31); +set_lcm_register(0XB300,0X00); +set_lcm_register(0XBD00,0X07); +set_lcm_register(0XBE00,0X07); +set_lcm_register(0XBF00,0X07); +set_lcm_register(0XF000,0X55); +set_lcm_register(0XF001,0XAA); +set_lcm_register(0XF002,0X52); +set_lcm_register(0XF003,0X08); +set_lcm_register(0XF004,0X02); +set_lcm_register(0XC301,0XA9); +set_lcm_register(0XFE01,0X94); +set_lcm_register(0XF600,0X60); +set_lcm_register(0X3500,0X00); +set_lcm_register(0XF000,0X55); +set_lcm_register(0XF001,0XAA); +set_lcm_register(0XF002,0X52); +set_lcm_register(0XF003,0X08); +set_lcm_register(0XF004,0X01);//01 +set_lcm_register(0X3600,0X00); +set_lcm_register(0X3a00,0X77); // + + + +send_ctrl_cmd(0X1100); // +MDELAY(120); +send_ctrl_cmd(0X2900); // +MDELAY(10); +send_ctrl_cmd(0X2C00); // +MDELAY(20); + +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + //lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + //lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(10); + send_ctrl_cmd(0x1000); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(150); + send_ctrl_cmd(0x2900); + MDELAY(20); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); + + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_read_data(); //spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_read_data(); //spi_read_data(); + + id = (id1<<8)|id2; + + + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + + + + +LCM_DRIVER lm050amybo1j_wvga_rm68120_lcm_drv = +{ + + .name = "lm050amybo1j_wvga_rm68120", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; + diff --git a/acer_e350_simcom75/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c b/acer_e350_simcom75/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c new file mode 100644 index 0000000..ea1b048 --- /dev/null +++ b/acer_e350_simcom75/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c @@ -0,0 +1,283 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + //SET_RESET_PIN(0); + //MDELAY(10); + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(50); + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + + +static void lcm_suspend(void) +{ + //SET_RESET_PIN(0); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ZERO); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + MDELAY(10); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + MDELAY(10); + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ZERO); // LCM_STBY + MDELAY(10); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST + MDELAY(10); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(50); + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE + MDELAY(120); // avoid LCD resume transint +} + +LCM_DRIVER lvds_wsvga_ti_lcm_drv = +{ + .name = "lvds_wsvga_ti", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/acer_e350_simcom75/lcm/mt65xx_lcm_list.c b/acer_e350_simcom75/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..26af860 --- /dev/null +++ b/acer_e350_simcom75/lcm/mt65xx_lcm_list.c @@ -0,0 +1,261 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER hx8369_6575_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_hvga_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER nt35582_mcu_6575_lcm_drv; +extern LCM_DRIVER nt35582_rgb_6575_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_hvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_qvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER ha5266_lcm_drv; +extern LCM_DRIVER hsd070idw1_lcm_drv; +extern LCM_DRIVER lg4571_lcm_drv; +extern LCM_DRIVER lvds_wsvga_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_lcm_drv; +extern LCM_DRIVER nt35565_3d_lcm_drv; +extern LCM_DRIVER tm070ddh03_lcm_drv; +extern LCM_DRIVER r61408_lcm_drv; +extern LCM_DRIVER qtb4d0058_wvga_nt35510_lcm_drv; +extern LCM_DRIVER kd50m4_wvga_otm8009a_lcm_drv; //amy0504 +extern LCM_DRIVER srl5002hn_wvga_nt35510_lcm_drv; //amy0504 +extern LCM_DRIVER yt50f23c0_wvga_ili7800_lcm_drv; +#if defined(N618_WVGA_NT35510)//tengdeqiang +extern LCM_DRIVER n618_wvga_nt35510_lcm_drv; +#endif +extern LCM_DRIVER nt35516_lcm_drv; +extern LCM_DRIVER tr3p2497_fwvga_hx8363b_lcm_drv; +#if defined(IPS3P2620_QHD_NT35516) +extern LCM_DRIVER ips3p2620_qhd_nt35516_lcm_drv; +#endif +#if defined(SRL4317GN_QHD_NT35516) +extern LCM_DRIVER srl4317gn_qhd_nt35516_lcm_drv; +#endif +#if defined(P2498_WVGA_NT35510) +extern LCM_DRIVER p2498_wvga_nt35510_lcm_drv; +#endif + +extern LCM_DRIVER kd50m14_wvga_nt35510_lcm_drv; +extern LCM_DRIVER n3p4527_wvga_nt35510_lcm_drv; + +#if defined(BLG9056B_WVGA_OTM8018B)//tengdeqiang +extern LCM_DRIVER blg9056b_wvga_otm8018b_lcm_drv; +#endif +extern LCM_DRIVER srl5002h_wvga_otm8009a_lcm_drv; //amy0518 +extern LCM_DRIVER sr4009gg_lg4573_lcm_drv; +extern LCM_DRIVER sr4009tn_nt35510_lcm_drv; +extern LCM_DRIVER yt40f51x6_wvga_ili9805_dsi_lcm_drv; +extern LCM_DRIVER dj3065a_hx8369a_lcm_drv;//LK@AUX_V900 +extern LCM_DRIVER tft3p2380_nt35510_lcm_drv; //amy0604 +extern LCM_DRIVER h40d07_nt35510_lcm_drv; //amy0604 +extern LCM_DRIVER lm050amybo1j_wvga_rm68120_lcm_drv; +extern LCM_DRIVER tft3p2710_fwvga_otm8018b_lcm_drv; + + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(HX8369_6575) + &hx8369_6575_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(NT35582_MCU_6575) + &nt35582_mcu_6575_lcm_drv, +#endif + +#if defined(NT35582_RGB_6575) + &nt35582_rgb_6575_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(R61408) + &r61408_lcm_drv, +#endif + +#if defined(HX8369_DSI_VDO) + &hx8369_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI) + &hx8369_dsi_6575_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_HVGA) + &hx8369_dsi_6575_hvga_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_QVGA) + &hx8369_dsi_6575_qvga_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(HA5266) + &ha5266_lcm_drv, +#endif + +#if defined(HSD070IDW1) + &hsd070idw1_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI_HVGA) + &hx8363_6575_dsi_hvga_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI) + &hx8363_6575_dsi_lcm_drv, +#endif + +#if defined(LG4571) + &lg4571_lcm_drv, +#endif + +#if defined(LVDS_WSVGA) + &lvds_wsvga_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI) + &lvds_wsvga_ti_lcm_drv, +#endif + +#if defined(NT35565_3D) + &nt35565_3d_lcm_drv, +#endif + +#if defined(TM070DDH03) + &tm070ddh03_lcm_drv, +#endif + +#if defined(N618_WVGA_NT35510)//tengdeqiang + &n618_wvga_nt35510_lcm_drv, +#endif + +#if defined(BLG9056B_WVGA_OTM8018B)//tengdeqiang + &blg9056b_wvga_otm8018b_lcm_drv, +#endif + +#if defined(QTB4D0058_WVGA_NT35510) //chailu + &qtb4d0058_wvga_nt35510_lcm_drv, +#endif +#if defined(KD50M4_WVGA_OTM8009A) //chailu + &kd50m4_wvga_otm8009a_lcm_drv, +#endif + +#if defined(YT50F23C0_WVGA_ILI7800) + &yt50f23c0_wvga_ili7800_lcm_drv, +#endif +#if defined(NT35516) + &nt35516_lcm_drv, +#endif +#if defined(IPS3P2620_QHD_NT35516) + &ips3p2620_qhd_nt35516_lcm_drv, +#endif +#if defined(SRL4317GN_QHD_NT35516) + &srl4317gn_qhd_nt35516_lcm_drv, +#endif +#if defined(KD50M14_WVGA_NT35510) + &kd50m14_wvga_nt35510_lcm_drv, +#endif +#if defined(SRL5002HN_WVGA_NT35510) + &srl5002hn_wvga_nt35510_lcm_drv, +#endif +#if defined(TR3P2497_FWVGA_HX8363B) + &tr3p2497_fwvga_hx8363b_lcm_drv, +#endif +#if defined(P2498_WVGA_NT35510) + &p2498_wvga_nt35510_lcm_drv, +#endif +#if defined(N3P4527_WVGA_NT35510) + &n3p4527_wvga_nt35510_lcm_drv, +#endif +#if defined(SRL5002H_WVGA_OTM8009A) //amy0518 + &srl5002h_wvga_otm8009a_lcm_drv, +#endif +#if defined(YT40F51X6_WVGA_ILI9805_DSI) + &yt40f51x6_wvga_ili9805_dsi_lcm_drv +#endif +#if defined(SR4009TN_WVGA_NT35510) + &sr4009tn_nt35510_lcm_drv, +#endif +#if defined(SR4009GG_WVGA_LG4573) + &sr4009gg_lg4573_lcm_drv, +#endif +#if defined(DJ3065A_WVGA_HX8369A) + &dj3065a_hx8369a_lcm_drv, +#endif +#if defined(TFT3P2380_WVGA_NT35510) //amy0604 + &tft3p2380_nt35510_lcm_drv, +#endif +#if defined(H40D07_WVGA_NT35510) //amy0604 + &h40d07_nt35510_lcm_drv, +#endif +#if defined(LM050AMYBO1J_WVGA_RM68120) + &lm050amybo1j_wvga_rm68120_lcm_drv, +#endif +#if defined(TFT3P2710_FWVGA_OTM8018B) + &tft3p2710_fwvga_otm8018b_lcm_drv, +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/acer_e350_simcom75/lcm/mtk_cust.mk b/acer_e350_simcom75/lcm/mtk_cust.mk new file mode 100755 index 0000000..ac0b85c --- /dev/null +++ b/acer_e350_simcom75/lcm/mtk_cust.mk @@ -0,0 +1,38 @@ +# Copyright Statement: +# +# This software/firmware and related documentation ("MediaTek Software") are +# protected under relevant copyright laws. The information contained herein +# is confidential and proprietary to MediaTek Inc. and/or its licensors. +# Without the prior written permission of MediaTek inc. and/or its licensors, +# any reproduction, modification, use or disclosure of MediaTek Software, +# and information contained herein, in whole or in part, shall be strictly prohibited. + +# MediaTek Inc. (C) 2010. All rights reserved. +# +# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON +# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH +# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES +# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES +# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK +# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR +# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND +# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO +# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +# +# The following software/firmware and/or related documentation ("MediaTek Software") +# have been modified by MediaTek Inc. All revisions are subject to any receiver's +# applicable license agreements with MediaTek Inc. + + +# Used for UBOOT +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/acer_e350_simcom75/lcm/n3p4527_wvga_nt35510/n3p4527_wvga_nt35510.c b/acer_e350_simcom75/lcm/n3p4527_wvga_nt35510/n3p4527_wvga_nt35510.c new file mode 100644 index 0000000..d0a58a0 --- /dev/null +++ b/acer_e350_simcom75/lcm/n3p4527_wvga_nt35510/n3p4527_wvga_nt35510.c @@ -0,0 +1,2268 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + + +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x5510 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_get_byte(unsigned int reg) +{ + unsigned int i; + int k; + unsigned char getbyte=0; + + // reg = (CTRL_ID | (reg & 0xFF)); + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (reg & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + reg <<= 1; + } + + UDELAY(2); + // SET_LSCK_LOW; + // UDELAY(2); + SET_LSCK_LOW; + UDELAY(2); + SET_LSCK_HIGH; + UDELAY(2); + + for (k = 7; k >= 0; k--) + { + if (GET_LSA0_BIT) { + getbyte |= (1 << k); + } + SET_LSCK_LOW; + UDELAY(5); + SET_LSCK_HIGH; + UDELAY(5); + } + + UDELAY(2); + + SET_LSDA_HIGH; + SET_LSCE_HIGH; + + return getbyte; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +#if 0 + send_ctrl_cmd(0xff00); // + send_data_cmd(0x80); + send_ctrl_cmd(0xff01); // enable EXTC + send_data_cmd(0x09); + send_ctrl_cmd(0xff02); // + send_data_cmd(0x01); + + send_ctrl_cmd(0xff80); // enable Orise mode + send_data_cmd(0x80); + send_ctrl_cmd(0xff81); // + send_data_cmd(0x09); + //************************************************************************** + send_ctrl_cmd(0xff03); // enable SPI+I2C cmd2 read + send_data_cmd(0x01); + + send_ctrl_cmd(0xC0B4); // dot Inversion + send_data_cmd(0x00); + + send_ctrl_cmd(0xC580); // Disable auto voltage detecting + send_data_cmd(0x03); + + send_ctrl_cmd(0xC582); // Disable auto voltage detecting + send_data_cmd(0xA3); + + send_ctrl_cmd(0xc590); // pump1 X2 ratio + send_data_cmd(0x96); + + send_ctrl_cmd(0xc591); // pump1 X2 ratio + send_data_cmd(0x0F);//edit by orise FAE2011.12.15 + + send_ctrl_cmd(0xc592); // pump45 + send_data_cmd(0x01); + + send_ctrl_cmd(0xc593); // VRGH/VRGL Setting + send_data_cmd(0x00); + + send_ctrl_cmd(0xc594); // pump12 clk freq(Normal) + send_data_cmd(0x33); + + send_ctrl_cmd(0xC0A3); + send_data_cmd(0x1B); + + send_ctrl_cmd(0xC481); + send_data_cmd(0x04); + + send_ctrl_cmd(0xD800); // GVDD setting + send_data_cmd(0x70); + + send_ctrl_cmd(0xD801); // NGVDD setting + send_data_cmd(0x70); + + send_ctrl_cmd(0xc5B1); + send_data_cmd(0x29); + + send_ctrl_cmd(0xD900); // Vcom setting + send_data_cmd(0x36); + + + //*********************************CE*********************************** + + send_ctrl_cmd(0xD400); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + + + //D5 setting + + + send_ctrl_cmd(0xD500); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + + send_ctrl_cmd(0xD680); + send_data_cmd(0x08); + //*********************************Gamma*********************************** + // Positive + send_ctrl_cmd(0xE100); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE101); + send_data_cmd(0x16); + + send_ctrl_cmd(0xE102); + send_data_cmd(0x17); + + send_ctrl_cmd(0xE103); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE104); + send_data_cmd(0x0B); + + send_ctrl_cmd(0xE105); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE106); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE107); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE108); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE109); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE10A); + send_data_cmd(0x02); + + send_ctrl_cmd(0xE10B); + send_data_cmd(0x06); + + send_ctrl_cmd(0xE10C); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE10D); + send_data_cmd(0x20); + + send_ctrl_cmd(0xE10E); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE10F); + send_data_cmd(0x16); + + + //NEGATIVE + + send_ctrl_cmd(0xE200); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE201); + send_data_cmd(0x16); + + send_ctrl_cmd(0xE202); + send_data_cmd(0x17); + + send_ctrl_cmd(0xE203); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE204); + send_data_cmd(0x0B); + + send_ctrl_cmd(0xE205); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE206); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE207); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE208); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE209); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE20A); + send_data_cmd(0x02); + + send_ctrl_cmd(0xE20B); + send_data_cmd(0x07); + + send_ctrl_cmd(0xE20C); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE20D); + send_data_cmd(0x20); + + send_ctrl_cmd(0xE20E); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE20F); + send_data_cmd(0x16); + + ///////////////////////////////////////////////////////////////////// + + send_ctrl_cmd(0xb3a6); // reg_panel_zinv, reg_panel_zinv_pixel, reg_panel_zinv_odd, reg_panel_zigzag, reg_panel_zigzag_blue, reg_panel_zigzag_shift_r, reg_panel_zigzag_odd + send_data_cmd(0x20); + + send_ctrl_cmd(0xb3a7); // panel_set[0] = 1 + send_data_cmd(0x01); + + send_ctrl_cmd(0xce80);// ce81[7:0] : vst1_shift[7:0] + send_data_cmd(0x85); + send_ctrl_cmd(0xce81);// ce82[7:0] : 0000, vst1_width[3:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xce82);// ce83[7:0] : vst1_tchop[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xce83);// ce84[7:0] : vst2_shift[7:0] + send_data_cmd(0x84); + send_ctrl_cmd(0xce84);// ce85[7:0] : 0000, vst2_width[3:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xce85);// ce86[7:0] : vst2_tchop[7:0] + send_data_cmd(0x00); + + //CEAx : clka1, clka2 + + send_ctrl_cmd(0xcea0);// cea1[7:0] : clka1_width[3:0], clka1_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xcea1);// cea2[7:0] : clka1_shift[7:0] + send_data_cmd(0x04); + send_ctrl_cmd(0xcea2);// cea3[7:0] : clka1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xcea3);// cea4[7:0] : clka1_switch[7:0] + send_data_cmd(0x21); + send_ctrl_cmd(0xcea4);// cea5[7:0] : clka1_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xcea5);// cea6[7:0] : clka1_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xcea6);// cea7[7:0] : clka1_tglue[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xcea7);// cea8[7:0] : clka2_width[3:0], clka2_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xcea8);// cea9[7:0] : clka2_shift[7:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xcea9);// ceaa[7:0] : clka2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceaa);// ceab[7:0] : clka2_switch[7:0] + send_data_cmd(0x22); + send_ctrl_cmd(0xceab);// ceac[7:0] : clka2_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xceac);// cead[7:0] : clka2_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xcead);// ceae[7:0] : clka2_tglue + send_data_cmd(0x00); + +//CEBx : clka3, clka4 + send_ctrl_cmd(0xceb0);// ceb1[7:0] : clka3_width[3:0], clka3_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xceb1);// ceb2[7:0] : clka3_shift[7:0] + send_data_cmd(0x02); + send_ctrl_cmd(0xceb2);// ceb3[7:0] : clka3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceb3);// ceb4[7:0] : clka3_switch[7:0] + send_data_cmd(0x23); + send_ctrl_cmd(0xceb4);// ceb5[7:0] : clka3_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xceb5);// ceb6[7:0] : clka3_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xceb6);// ceb7[7:0] : clka3_tglue[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xceb7);// ceb8[7:0] : clka4_width[3:0], clka2_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xceb8);// ceb9[7:0] : clka4_shift[7:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xceb9);// ceba[7:0] : clka4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceba);// cebb[7:0] : clka4_switch[7:0] + send_data_cmd(0x24); + send_ctrl_cmd(0xcebb);// cebc[7:0] : clka4_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xcebc);// cebd[7:0] : clka4_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xcebd);// cebe[7:0] : clka4_tglue + send_data_cmd(0x00); + + +//CFCx : + send_ctrl_cmd(0xcfc0);// cfc1[7:0] : eclk_normal_width[7:0] + send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc1);// cfc2[7:0] : eclk_partial_width[7:0] send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc2);// cfc3[7:0] : all_normal_tchop[7:0] send_data_cmd(0x20); + + send_ctrl_cmd(0xcfc3);// cfc4[7:0] : all_partial_tchop[7:0] send_data_cmd(0x20); + + send_ctrl_cmd(0xcfc4);// cfc5[7:0] : eclk1_follow[3:0], eclk2_follow[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc5);// cfc6[7:0] : eclk3_follow[3:0], eclk4_follow[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc6);// cfc7[7:0] : 00, vstmask, vendmask, 00, dir1, dir2 (0=VGL, 1=VGH) send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc7);// cfc8[7:0] : reg_goa_gnd_opt, reg_goa_dpgm_tail_set, reg_goa_f_gating_en, reg_goa_f_odd_gating, toggle_mod1, 2, 3, 4 + send_data_cmd(0x00); // GND OPT1 (00-->80 2011/10/28) + + send_ctrl_cmd(0xcfc8);// cfc9[7:0] : duty_block[3:0], DGPM[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc9);// cfca[7:0] : reg_goa_gnd_period[7:0] send_data_cmd(0x00); // Gate PCH (CLK base) (00-->0a 2011/10/28) + +//CFDx : + send_ctrl_cmd(0xcfd0);// cfd1[7:0] : 0000000, reg_goa_frame_odd_high + send_data_cmd(0x00); + + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- + +// CB8x + send_ctrl_cmd(0xcb80);//cb81[7:0] : signal mode setting of sig4, sig3, sig2, sig1 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb81);//cb82[7:0] : signal mode setting of sig8, sig7, sig6, sig5 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb82);//cb83[7:0] : signal mode setting of sig12, sig11, sig10, sig9 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb83);//cb84[7:0] : signal mode setting of sig16, sig15, sig14, sig13 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb84);//cb85[7:0] : signal mode setting of sig20, sig19, sig18, sig17 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb85);//cb86[7:0] : signal mode setting of sig24, sig23, sig22, sig21 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb86);//cb87[7:0] : signal mode setting of sig28, sig27, sig26, sig25 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb87);//cb88[7:0] : signal mode setting of sig32, sig31, sig30, sig29 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb88);//cb89[7:0] : signal mode setting of sig36, sig35, sig34, sig33 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb89);//cb8a[7:0] : signal mode setting of sig40, sig39, sig38, sig37 ( sleep in ) + send_data_cmd(0x00); + +// cb9x + send_ctrl_cmd(0xcb90);//cb91[7:0] : enmode L-byte of sig1 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb91);//cb92[7:0] : enmode L-byte of sig2 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb92);//cb93[7:0] : enmode L-byte of sig3 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb93);//cb94[7:0] : enmode L-byte of sig4 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb94);//cb95[7:0] : enmode L-byte of sig5 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb95);//cb96[7:0] : enmode L-byte of sig6 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb96);//cb97[7:0] : enmode L-byte of sig7 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb97);//cb98[7:0] : enmode L-byte of sig8 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb98);//cb99[7:0] : enmode L-byte of sig9 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb99);//cb9a[7:0] : enmode L-byte of sig10 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9a);//cb9b[7:0] : enmode L-byte of sig11 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9b);//cb9c[7:0] : enmode L-byte of sig12 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9c);//cb9d[7:0] : enmode L-byte of sig13 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9d);//cb9e[7:0] : enmode L-byte of sig14 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9e);//cb9f[7:0] : enmode L-byte of sig15 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbax + send_ctrl_cmd(0xcba0);//cba1[7:0] : enmode L-byte of sig16 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba1);//cba2[7:0] : enmode L-byte of sig17 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba2);//cba3[7:0] : enmode L-byte of sig18 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba3);//cba4[7:0] : enmode L-byte of sig19 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba4);//cba5[7:0] : enmode L-byte of sig20 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba5);//cba6[7:0] : enmode L-byte of sig21 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba6);//cba7[7:0] : enmode L-byte of sig22 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba7);//cba8[7:0] : enmode L-byte of sig23 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba8);//cba9[7:0] : enmode L-byte of sig24 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba9);//cbaa[7:0] : enmode L-byte of sig25 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbaa);//cbab[7:0] : enmode L-byte of sig26 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbab);//cbac[7:0] : enmode L-byte of sig27 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbac);//cbad[7:0] : enmode L-byte of sig28 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbad);//cbae[7:0] : enmode L-byte of sig29 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbae);//cbaf[7:0] : enmode L-byte of sig30 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbbx + send_ctrl_cmd(0xcbb0);//cbb1[7:0] : enmode L-byte of sig31 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb1);//cbb2[7:0] : enmode L-byte of sig32 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb2);//cbb3[7:0] : enmode L-byte of sig33 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb3);//cbb4[7:0] : enmode L-byte of sig34 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb4);//cbb5[7:0] : enmode L-byte of sig35 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb5);//cbb6[7:0] : enmode L-byte of sig36 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb6);//cbb7[7:0] : enmode L-byte of sig37 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb7);//cbb8[7:0] : enmode L-byte of sig38 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb8);//cbb9[7:0] : enmode L-byte of sig39 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb9);//cbba[7:0] : enmode L-byte of sig40 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbcx + send_ctrl_cmd(0xcbc0);//cbc1[7:0] : enmode H-byte of sig1 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc1);//cbc2[7:0] : enmode H-byte of sig2 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc2);//cbc3[7:0] : enmode H-byte of sig3 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc3);//cbc4[7:0] : enmode H-byte of sig4 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc4);//cbc5[7:0] : enmode H-byte of sig5 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc5);//cbc6[7:0] : enmode H-byte of sig6 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc6);//cbc7[7:0] : enmode H-byte of sig7 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc7);//cbc8[7:0] : enmode H-byte of sig8 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc8);//cbc9[7:0] : enmode H-byte of sig9 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc9);//cbca[7:0] : enmode H-byte of sig10 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbca);//cbcb[7:0] : enmode H-byte of sig11 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcb);//cbcc[7:0] : enmode H-byte of sig12 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcc);//cbcd[7:0] : enmode H-byte of sig13 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcd);//cbce[7:0] : enmode H-byte of sig14 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbce);//cbcf[7:0] : enmode H-byte of sig15 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + +// cbdx + send_ctrl_cmd(0xcbd0);//cbd1[7:0] : enmode H-byte of sig16 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd1);//cbd2[7:0] : enmode H-byte of sig17 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd2);//cbd3[7:0] : enmode H-byte of sig18 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd3);//cbd4[7:0] : enmode H-byte of sig19 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd4);//cbd5[7:0] : enmode H-byte of sig20 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd5);//cbd6[7:0] : enmode H-byte of sig21 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd6);//cbd7[7:0] : enmode H-byte of sig22 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd7);//cbd8[7:0] : enmode H-byte of sig23 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd8);//cbd9[7:0] : enmode H-byte of sig24 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd9);//cbda[7:0] : enmode H-byte of sig25 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbda);//cbdb[7:0] : enmode H-byte of sig26 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbdb);//cbdc[7:0] : enmode H-byte of sig27 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbdc);//cbdd[7:0] : enmode H-byte of sig28 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbdd);//cbde[7:0] : enmode H-byte of sig29 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbde);//cbdf[7:0] : enmode H-byte of sig30 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + +// cbex + send_ctrl_cmd(0xcbe0);//cbe1[7:0] : enmode H-byte of sig31 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe1);//cbe2[7:0] : enmode H-byte of sig32 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe2);//cbe3[7:0] : enmode H-byte of sig33 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe3);//cbe4[7:0] : enmode H-byte of sig34 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe4);//cbe5[7:0] : enmode H-byte of sig35 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe5);//cbe6[7:0] : enmode H-byte of sig36 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe6);//cbe7[7:0] : enmode H-byte of sig37 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe7);//cbe8[7:0] : enmode H-byte of sig38 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe8);//cbe9[7:0] : enmode H-byte of sig39 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe9);//cbea[7:0] : enmode H-byte of sig40 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + + +// cbfx + send_ctrl_cmd(0xcbf0);//cbf1[7:0] : lvd enmode of ( sig4, sig3, sig2, sig1) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf1);//cbf2[7:0] : lvd enmode of ( sig8, sig7, sig6, sig5) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf2);//cbf3[7:0] : lvd enmode of (sig12, sig11, sig10, sig9) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf3);//cbf4[7:0] : lvd enmode of (sig16, sig15, sig14, sig13) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf4);//cbf5[7:0] : lvd enmode of (sig20, sig19, sig18, sig17) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf5);//cbf6[7:0] : lvd enmode of (sig24, sig23, sig22, sig21) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf6);//cbf7[7:0] : lvd enmode of (sig28, sig27, sig26, sig25) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf7);//cbf8[7:0] : lvd enmode of (sig32, sig31, sig30, sig29) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf8);//cbf9[7:0] : lvd enmode of (sig36, sig35, sig34, sig33) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf9);//cbfa[7:0] : lvd enmode of (sig40, sig39, sig38, sig37) + send_data_cmd(0xFF); + +// cc8x + send_ctrl_cmd(0xcc80);//cc81[7:0] : reg setting for signal01 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc81);//cc82[7:0] : reg setting for signal02 selection with u2d mode + send_data_cmd(0x26); + send_ctrl_cmd(0xcc82);//cc83[7:0] : reg setting for signal03 selection with u2d mode + send_data_cmd(0x09); + send_ctrl_cmd(0xcc83);//cc84[7:0] : reg setting for signal04 selection with u2d mode + send_data_cmd(0x0B); + send_ctrl_cmd(0xcc84);//cc85[7:0] : reg setting for signal05 selection with u2d mode + send_data_cmd(0x01); + send_ctrl_cmd(0xcc85);//cc86[7:0] : reg setting for signal06 selection with u2d mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcc86);//cc87[7:0] : reg setting for signal07 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc87);//cc88[7:0] : reg setting for signal08 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc88);//cc89[7:0] : reg setting for signal09 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc89);//cc8a[7:0] : reg setting for signal10 selection with u2d mode + send_data_cmd(0x00); + +// cc9x + send_ctrl_cmd(0xcc90);//cc91[7:0] : reg setting for signal11 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc91);//cc92[7:0] : reg setting for signal12 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc92);//cc93[7:0] : reg setting for signal13 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc93);//cc94[7:0] : reg setting for signal14 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc94);//cc95[7:0] : reg setting for signal15 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc95);//cc96[7:0] : reg setting for signal16 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc96);//cc97[7:0] : reg setting for signal17 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc97);//cc98[7:0] : reg setting for signal18 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc98);//cc99[7:0] : reg setting for signal19 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc99);//cc9a[7:0] : reg setting for signal20 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc9a);//cc9b[7:0] : reg setting for signal21 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc9b);//cc9c[7:0] : reg setting for signal22 selection with u2d mode + send_data_cmd(0x26); + send_ctrl_cmd(0xcc9c);//cc9d[7:0] : reg setting for signal23 selection with u2d mode + send_data_cmd(0x0A); + send_ctrl_cmd(0xcc9d);//cc9e[7:0] : reg setting for signal24 selection with u2d mode + send_data_cmd(0x0C); + send_ctrl_cmd(0xcc9e);//cc9f[7:0] : reg setting for signal25 selection with u2d mode + send_data_cmd(0x02); + +// ccax + send_ctrl_cmd(0xcca0);//cca1[7:0] : reg setting for signal26 selection with u2d mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcca1);//cca2[7:0] : reg setting for signal27 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca2);//cca3[7:0] : reg setting for signal28 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca3);//cca4[7:0] : reg setting for signal29 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca4);//cca5[7:0] : reg setting for signal20 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca5);//cca6[7:0] : reg setting for signal31 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca6);//cca7[7:0] : reg setting for signal32 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca7);//cca8[7:0] : reg setting for signal33 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca8);//cca9[7:0] : reg setting for signal34 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca9);//ccaa[7:0] : reg setting for signal35 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccaa);//ccab[7:0] : reg setting for signal36 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccab);//ccac[7:0] : reg setting for signal37 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccac);//ccad[7:0] : reg setting for signal38 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccad);//ccae[7:0] : reg setting for signal39 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccae);//ccaf[7:0] : reg setting for signal40 selection with u2d mode + send_data_cmd(0x00); + +// ccbx + send_ctrl_cmd(0xccb0);//ccb1[7:0] : reg setting for signal01 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb1);//ccb2[7:0] : reg setting for signal02 selection with d2u mode + send_data_cmd(0x25); + send_ctrl_cmd(0xccb2);//ccb3[7:0] : reg setting for signal03 selection with d2u mode + send_data_cmd(0x0C); + send_ctrl_cmd(0xccb3);//ccb4[7:0] : reg setting for signal04 selection with d2u mode + send_data_cmd(0x0A); + send_ctrl_cmd(0xccb4);//ccb5[7:0] : reg setting for signal05 selection with d2u mode + send_data_cmd(0x02); + send_ctrl_cmd(0xccb5);//ccb6[7:0] : reg setting for signal06 selection with d2u mode + send_data_cmd(0x26); + send_ctrl_cmd(0xccb6);//ccb7[7:0] : reg setting for signal07 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb7);//ccb8[7:0] : reg setting for signal08 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb8);//ccb9[7:0] : reg setting for signal09 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb9);//ccba[7:0] : reg setting for signal10 selection with d2u mode + send_data_cmd(0x00); + +// cccx + send_ctrl_cmd(0xccc0);//ccc1[7:0] : reg setting for signal11 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc1);//ccc2[7:0] : reg setting for signal12 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc2);//ccc3[7:0] : reg setting for signal13 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc3);//ccc4[7:0] : reg setting for signal14 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc4);//ccc5[7:0] : reg setting for signal15 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc5);//ccc6[7:0] : reg setting for signal16 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc6);//ccc7[7:0] : reg setting for signal17 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc7);//ccc8[7:0] : reg setting for signal18 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc8);//ccc9[7:0] : reg setting for signal19 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc9);//ccca[7:0] : reg setting for signal20 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccca);//cccb[7:0] : reg setting for signal21 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcccb);//cccc[7:0] : reg setting for signal22 selection with d2u mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcccc);//cccd[7:0] : reg setting for signal23 selection with d2u mode + send_data_cmd(0x0B); + send_ctrl_cmd(0xcccd);//ccce[7:0] : reg setting for signal24 selection with d2u mode + send_data_cmd(0x09); + send_ctrl_cmd(0xccce);//cccf[7:0] : reg setting for signal25 selection with d2u mode + send_data_cmd(0x01); + +// ccdx + send_ctrl_cmd(0xccd0);//ccd1[7:0] : reg setting for signal26 selection with d2u mode + send_data_cmd(0x26); + send_ctrl_cmd(0xccd1);//ccd2[7:0] : reg setting for signal27 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd2);//ccd3[7:0] : reg setting for signal28 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd3);//ccd4[7:0] : reg setting for signal29 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd4);//ccd5[7:0] : reg setting for signal30 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd5);//ccd6[7:0] : reg setting for signal31 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd6);//ccd7[7:0] : reg setting for signal32 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd7);//ccd8[7:0] : reg setting for signal33 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd8);//ccd9[7:0] : reg setting for signal34 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd9);//ccda[7:0] : reg setting for signal35 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccda);//ccdb[7:0] : reg setting for signal36 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdb);//ccdc[7:0] : reg setting for signal37 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdc);//ccdd[7:0] : reg setting for signal38 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdd);//ccde[7:0] : reg setting for signal39 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccde);//ccdf[7:0] : reg setting for signal40 selection with d2u mode + send_data_cmd(0x00); + MDELAY(12); + + send_ctrl_cmd(0x3600); + send_data_cmd(0x00); + + send_ctrl_cmd(0xc181); + send_data_cmd(0x66); + + send_ctrl_cmd(0xc5B1); + send_data_cmd(0x29); + + send_ctrl_cmd(0xb282); + send_data_cmd(0x20); + + send_ctrl_cmd(0xc082); + send_data_cmd(0x00); + + send_ctrl_cmd(0xc083); + send_data_cmd(0x16); + + send_ctrl_cmd(0xc084); + send_data_cmd(0x08); + + send_ctrl_cmd(0xc1A1); + send_data_cmd(0x08); + + send_ctrl_cmd(0xCFC7); + send_data_cmd(0x02); + + send_ctrl_cmd(0x1100); + // printf(" Sleep out \n"); + MDELAY(150); + + send_ctrl_cmd(0x2900); + //printf(" Display on \n"); + MDELAY(50); +#else + //ENABLE PAGE 1 + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x01); + + //VGMP/VGSP 4.5V/0V + send_ctrl_cmd(0xBC00);send_data_cmd(0x00); + send_ctrl_cmd(0xBC01);send_data_cmd(0xa8); //78//===68 + send_ctrl_cmd(0xBC02);send_data_cmd(0x00);//00 + + //VGMN/VGSN -4.5V/0V + send_ctrl_cmd(0xBD00);send_data_cmd(0x00); + send_ctrl_cmd(0xBD01);send_data_cmd(0x7c); //78 + send_ctrl_cmd(0xBD02);send_data_cmd(0x00);//00 + + //VCOM + send_ctrl_cmd(0xBE00);send_data_cmd(0x00); + send_ctrl_cmd(0xBE01);send_data_cmd(0x65); + + //AVDD Set AVDD 5.2V + send_ctrl_cmd(0xB000);send_data_cmd(0x0D); + send_ctrl_cmd(0xB001);send_data_cmd(0x0D); + send_ctrl_cmd(0xB002);send_data_cmd(0x0D); + //AVEE -5.2V + send_ctrl_cmd(0xB100);send_data_cmd(0x0D); + send_ctrl_cmd(0xB101);send_data_cmd(0x0D); + send_ctrl_cmd(0xB102);send_data_cmd(0x0D); + //VGLX ratio + send_ctrl_cmd(0xBA00);send_data_cmd(0x14); //14: AVEE-AVDD + send_ctrl_cmd(0xBA01);send_data_cmd(0x14); + send_ctrl_cmd(0xBA02);send_data_cmd(0x14); + //VGH 15V (Free pump) + send_ctrl_cmd(0xBF00);send_data_cmd(0x01); + send_ctrl_cmd(0xB301);send_data_cmd(0x0F); + send_ctrl_cmd(0xB301);send_data_cmd(0x0F); + send_ctrl_cmd(0xB302);send_data_cmd(0x0F); + + //VGH VOLTAGE SETTING + send_ctrl_cmd(0xB900);send_data_cmd(0x34); + send_ctrl_cmd(0xB901);send_data_cmd(0x34); + send_ctrl_cmd(0xB902);send_data_cmd(0x34); + //VCL POWERCONTROL + send_ctrl_cmd(0xB800);send_data_cmd(0x34); + send_ctrl_cmd(0xB801);send_data_cmd(0x34); + send_ctrl_cmd(0xB802);send_data_cmd(0x34); + + ///* + //GAMMA SETING RED + send_ctrl_cmd(0xD100);send_data_cmd(0x00); + send_ctrl_cmd(0xD101);send_data_cmd(0x33); + send_ctrl_cmd(0xD102);send_data_cmd(0x00); + send_ctrl_cmd(0xD103);send_data_cmd(0x34); + send_ctrl_cmd(0xD104);send_data_cmd(0x00); + send_ctrl_cmd(0xD105);send_data_cmd(0x3A); + send_ctrl_cmd(0xD106);send_data_cmd(0x00); + send_ctrl_cmd(0xD107);send_data_cmd(0x4A); + send_ctrl_cmd(0xD108);send_data_cmd(0x00); + send_ctrl_cmd(0xD109);send_data_cmd(0x5C); + send_ctrl_cmd(0xD10A);send_data_cmd(0x00); + send_ctrl_cmd(0xD10B);send_data_cmd(0x81); + send_ctrl_cmd(0xD10C);send_data_cmd(0x00); + send_ctrl_cmd(0xD10D);send_data_cmd(0xA6); + send_ctrl_cmd(0xD10E);send_data_cmd(0x00); + send_ctrl_cmd(0xD10F);send_data_cmd(0xE5); + send_ctrl_cmd(0xD110);send_data_cmd(0x01); + send_ctrl_cmd(0xD111);send_data_cmd(0x13); + send_ctrl_cmd(0xD112);send_data_cmd(0x01); + send_ctrl_cmd(0xD113);send_data_cmd(0x54); + send_ctrl_cmd(0xD114);send_data_cmd(0x01); + send_ctrl_cmd(0xD115);send_data_cmd(0x82); + send_ctrl_cmd(0xD116);send_data_cmd(0x01); + send_ctrl_cmd(0xD117);send_data_cmd(0xCA); + send_ctrl_cmd(0xD118);send_data_cmd(0x02); + send_ctrl_cmd(0xD119);send_data_cmd(0x00); + send_ctrl_cmd(0xD11A);send_data_cmd(0x02); + send_ctrl_cmd(0xD11B);send_data_cmd(0x01); + send_ctrl_cmd(0xD11C);send_data_cmd(0x02); + send_ctrl_cmd(0xD11D);send_data_cmd(0x34); + send_ctrl_cmd(0xD11E);send_data_cmd(0x02); + send_ctrl_cmd(0xD11F);send_data_cmd(0x67); + send_ctrl_cmd(0xD120);send_data_cmd(0x02); + send_ctrl_cmd(0xD121);send_data_cmd(0x84); + send_ctrl_cmd(0xD122);send_data_cmd(0x02); + send_ctrl_cmd(0xD123);send_data_cmd(0xA4); + send_ctrl_cmd(0xD124);send_data_cmd(0x02); + send_ctrl_cmd(0xD125);send_data_cmd(0xB7); + send_ctrl_cmd(0xD126);send_data_cmd(0x02); + send_ctrl_cmd(0xD127);send_data_cmd(0xCF); + send_ctrl_cmd(0xD128);send_data_cmd(0x02); + send_ctrl_cmd(0xD129);send_data_cmd(0xDE); + send_ctrl_cmd(0xD12A);send_data_cmd(0x02); + send_ctrl_cmd(0xD12B);send_data_cmd(0xF2); + send_ctrl_cmd(0xD12C);send_data_cmd(0x02); + send_ctrl_cmd(0xD12D);send_data_cmd(0xFE); + send_ctrl_cmd(0xD12E);send_data_cmd(0x03); + send_ctrl_cmd(0xD12F);send_data_cmd(0x10); + send_ctrl_cmd(0xD130);send_data_cmd(0x03); + send_ctrl_cmd(0xD131);send_data_cmd(0x33); + send_ctrl_cmd(0xD132);send_data_cmd(0x03); + send_ctrl_cmd(0xD133);send_data_cmd(0x6D); + + send_ctrl_cmd(0xD200);send_data_cmd(0x00); + send_ctrl_cmd(0xD201);send_data_cmd(0x33); + send_ctrl_cmd(0xD202);send_data_cmd(0x00); + send_ctrl_cmd(0xD203);send_data_cmd(0x34); + send_ctrl_cmd(0xD204);send_data_cmd(0x00); + send_ctrl_cmd(0xD205);send_data_cmd(0x3A); + send_ctrl_cmd(0xD206);send_data_cmd(0x00); + send_ctrl_cmd(0xD207);send_data_cmd(0x4A); + send_ctrl_cmd(0xD208);send_data_cmd(0x00); + send_ctrl_cmd(0xD209);send_data_cmd(0x5C); + send_ctrl_cmd(0xD20A);send_data_cmd(0x00); + send_ctrl_cmd(0xD20B);send_data_cmd(0x81); + send_ctrl_cmd(0xD20C);send_data_cmd(0x00); + send_ctrl_cmd(0xD20D);send_data_cmd(0xA6); + send_ctrl_cmd(0xD20E);send_data_cmd(0x00); + send_ctrl_cmd(0xD20F);send_data_cmd(0xE5); + send_ctrl_cmd(0xD210);send_data_cmd(0x01); + send_ctrl_cmd(0xD211);send_data_cmd(0x13); + send_ctrl_cmd(0xD212);send_data_cmd(0x01); + send_ctrl_cmd(0xD213);send_data_cmd(0x54); + send_ctrl_cmd(0xD214);send_data_cmd(0x01); + send_ctrl_cmd(0xD215);send_data_cmd(0x82); + send_ctrl_cmd(0xD216);send_data_cmd(0x01); + send_ctrl_cmd(0xD217);send_data_cmd(0xCA); + send_ctrl_cmd(0xD218);send_data_cmd(0x02); + send_ctrl_cmd(0xD219);send_data_cmd(0x00); + send_ctrl_cmd(0xD21A);send_data_cmd(0x02); + send_ctrl_cmd(0xD21B);send_data_cmd(0x01); + send_ctrl_cmd(0xD21C);send_data_cmd(0x02); + send_ctrl_cmd(0xD21D);send_data_cmd(0x34); + send_ctrl_cmd(0xD21E);send_data_cmd(0x02); + send_ctrl_cmd(0xD21F);send_data_cmd(0x67); + send_ctrl_cmd(0xD220);send_data_cmd(0x02); + send_ctrl_cmd(0xD221);send_data_cmd(0x84); + send_ctrl_cmd(0xD222);send_data_cmd(0x02); + send_ctrl_cmd(0xD223);send_data_cmd(0xA4); + send_ctrl_cmd(0xD224);send_data_cmd(0x02); + send_ctrl_cmd(0xD225);send_data_cmd(0xB7); + send_ctrl_cmd(0xD226);send_data_cmd(0x02); + send_ctrl_cmd(0xD227);send_data_cmd(0xCF); + send_ctrl_cmd(0xD228);send_data_cmd(0x02); + send_ctrl_cmd(0xD229);send_data_cmd(0xDE); + send_ctrl_cmd(0xD22A);send_data_cmd(0x02); + send_ctrl_cmd(0xD22B);send_data_cmd(0xF2); + send_ctrl_cmd(0xD22C);send_data_cmd(0x02); + send_ctrl_cmd(0xD22D);send_data_cmd(0xFE); + send_ctrl_cmd(0xD22E);send_data_cmd(0x03); + send_ctrl_cmd(0xD22F);send_data_cmd(0x10); + send_ctrl_cmd(0xD230);send_data_cmd(0x03); + send_ctrl_cmd(0xD231);send_data_cmd(0x33); + send_ctrl_cmd(0xD232);send_data_cmd(0x03); + send_ctrl_cmd(0xD233);send_data_cmd(0x6D); + + send_ctrl_cmd(0xD300);send_data_cmd(0x00); + send_ctrl_cmd(0xD301);send_data_cmd(0x33); + send_ctrl_cmd(0xD302);send_data_cmd(0x00); + send_ctrl_cmd(0xD303);send_data_cmd(0x34); + send_ctrl_cmd(0xD304);send_data_cmd(0x00); + send_ctrl_cmd(0xD305);send_data_cmd(0x3A); + send_ctrl_cmd(0xD306);send_data_cmd(0x00); + send_ctrl_cmd(0xD307);send_data_cmd(0x4A); + send_ctrl_cmd(0xD308);send_data_cmd(0x00); + send_ctrl_cmd(0xD309);send_data_cmd(0x5C); + send_ctrl_cmd(0xD30A);send_data_cmd(0x00); + send_ctrl_cmd(0xD30B);send_data_cmd(0x81); + send_ctrl_cmd(0xD30C);send_data_cmd(0x00); + send_ctrl_cmd(0xD30D);send_data_cmd(0xA6); + send_ctrl_cmd(0xD30E);send_data_cmd(0x00); + send_ctrl_cmd(0xD30F);send_data_cmd(0xE5); + send_ctrl_cmd(0xD310);send_data_cmd(0x01); + send_ctrl_cmd(0xD311);send_data_cmd(0x13); + send_ctrl_cmd(0xD312);send_data_cmd(0x01); + send_ctrl_cmd(0xD313);send_data_cmd(0x54); + send_ctrl_cmd(0xD314);send_data_cmd(0x01); + send_ctrl_cmd(0xD315);send_data_cmd(0x82); + send_ctrl_cmd(0xD316);send_data_cmd(0x01); + send_ctrl_cmd(0xD317);send_data_cmd(0xCA); + send_ctrl_cmd(0xD318);send_data_cmd(0x02); + send_ctrl_cmd(0xD319);send_data_cmd(0x00); + send_ctrl_cmd(0xD31A);send_data_cmd(0x02); + send_ctrl_cmd(0xD31B);send_data_cmd(0x01); + send_ctrl_cmd(0xD31C);send_data_cmd(0x02); + send_ctrl_cmd(0xD31D);send_data_cmd(0x34); + send_ctrl_cmd(0xD31E);send_data_cmd(0x02); + send_ctrl_cmd(0xD31F);send_data_cmd(0x67); + send_ctrl_cmd(0xD320);send_data_cmd(0x02); + send_ctrl_cmd(0xD321);send_data_cmd(0x84); + send_ctrl_cmd(0xD322);send_data_cmd(0x02); + send_ctrl_cmd(0xD323);send_data_cmd(0xA4); + send_ctrl_cmd(0xD324);send_data_cmd(0x02); + send_ctrl_cmd(0xD325);send_data_cmd(0xB7); + send_ctrl_cmd(0xD326);send_data_cmd(0x02); + send_ctrl_cmd(0xD327);send_data_cmd(0xCF); + send_ctrl_cmd(0xD328);send_data_cmd(0x02); + send_ctrl_cmd(0xD329);send_data_cmd(0xDE); + send_ctrl_cmd(0xD32A);send_data_cmd(0x02); + send_ctrl_cmd(0xD32B);send_data_cmd(0xF2); + send_ctrl_cmd(0xD32C);send_data_cmd(0x02); + send_ctrl_cmd(0xD32D);send_data_cmd(0xFE); + send_ctrl_cmd(0xD32E);send_data_cmd(0x03); + send_ctrl_cmd(0xD32F);send_data_cmd(0x10); + send_ctrl_cmd(0xD330);send_data_cmd(0x03); + send_ctrl_cmd(0xD331);send_data_cmd(0x33); + send_ctrl_cmd(0xD332);send_data_cmd(0x03); + send_ctrl_cmd(0xD333);send_data_cmd(0x6D); + + send_ctrl_cmd(0xD400);send_data_cmd(0x00); + send_ctrl_cmd(0xD401);send_data_cmd(0x33); + send_ctrl_cmd(0xD402);send_data_cmd(0x00); + send_ctrl_cmd(0xD403);send_data_cmd(0x34); + send_ctrl_cmd(0xD404);send_data_cmd(0x00); + send_ctrl_cmd(0xD405);send_data_cmd(0x3A); + send_ctrl_cmd(0xD406);send_data_cmd(0x00); + send_ctrl_cmd(0xD407);send_data_cmd(0x4A); + send_ctrl_cmd(0xD408);send_data_cmd(0x00); + send_ctrl_cmd(0xD409);send_data_cmd(0x5C); + send_ctrl_cmd(0xD40A);send_data_cmd(0x00); + send_ctrl_cmd(0xD40B);send_data_cmd(0x81); + send_ctrl_cmd(0xD40C);send_data_cmd(0x00); + send_ctrl_cmd(0xD40D);send_data_cmd(0xA6); + send_ctrl_cmd(0xD40E);send_data_cmd(0x00); + send_ctrl_cmd(0xD40F);send_data_cmd(0xE5); + send_ctrl_cmd(0xD410);send_data_cmd(0x01); + send_ctrl_cmd(0xD411);send_data_cmd(0x13); + send_ctrl_cmd(0xD412);send_data_cmd(0x01); + send_ctrl_cmd(0xD413);send_data_cmd(0x54); + send_ctrl_cmd(0xD414);send_data_cmd(0x01); + send_ctrl_cmd(0xD415);send_data_cmd(0x82); + send_ctrl_cmd(0xD416);send_data_cmd(0x01); + send_ctrl_cmd(0xD417);send_data_cmd(0xCA); + send_ctrl_cmd(0xD418);send_data_cmd(0x02); + send_ctrl_cmd(0xD419);send_data_cmd(0x00); + send_ctrl_cmd(0xD41A);send_data_cmd(0x02); + send_ctrl_cmd(0xD41B);send_data_cmd(0x01); + send_ctrl_cmd(0xD41C);send_data_cmd(0x02); + send_ctrl_cmd(0xD41D);send_data_cmd(0x34); + send_ctrl_cmd(0xD41E);send_data_cmd(0x02); + send_ctrl_cmd(0xD41F);send_data_cmd(0x67); + send_ctrl_cmd(0xD420);send_data_cmd(0x02); + send_ctrl_cmd(0xD421);send_data_cmd(0x84); + send_ctrl_cmd(0xD422);send_data_cmd(0x02); + send_ctrl_cmd(0xD423);send_data_cmd(0xA4); + send_ctrl_cmd(0xD424);send_data_cmd(0x02); + send_ctrl_cmd(0xD425);send_data_cmd(0xB7); + send_ctrl_cmd(0xD426);send_data_cmd(0x02); + send_ctrl_cmd(0xD427);send_data_cmd(0xCF); + send_ctrl_cmd(0xD428);send_data_cmd(0x02); + send_ctrl_cmd(0xD429);send_data_cmd(0xDE); + send_ctrl_cmd(0xD42A);send_data_cmd(0x02); + send_ctrl_cmd(0xD42B);send_data_cmd(0xF2); + send_ctrl_cmd(0xD42C);send_data_cmd(0x02); + send_ctrl_cmd(0xD42D);send_data_cmd(0xFE); + send_ctrl_cmd(0xD42E);send_data_cmd(0x03); + send_ctrl_cmd(0xD42F);send_data_cmd(0x10); + send_ctrl_cmd(0xD430);send_data_cmd(0x03); + send_ctrl_cmd(0xD431);send_data_cmd(0x33); + send_ctrl_cmd(0xD432);send_data_cmd(0x03); + send_ctrl_cmd(0xD433);send_data_cmd(0x6D); + + send_ctrl_cmd(0xD500);send_data_cmd(0x00); + send_ctrl_cmd(0xD501);send_data_cmd(0x33); + send_ctrl_cmd(0xD502);send_data_cmd(0x00); + send_ctrl_cmd(0xD503);send_data_cmd(0x34); + send_ctrl_cmd(0xD504);send_data_cmd(0x00); + send_ctrl_cmd(0xD505);send_data_cmd(0x3A); + send_ctrl_cmd(0xD506);send_data_cmd(0x00); + send_ctrl_cmd(0xD507);send_data_cmd(0x4A); + send_ctrl_cmd(0xD508);send_data_cmd(0x00); + send_ctrl_cmd(0xD509);send_data_cmd(0x5C); + send_ctrl_cmd(0xD50A);send_data_cmd(0x00); + send_ctrl_cmd(0xD50B);send_data_cmd(0x81); + send_ctrl_cmd(0xD50C);send_data_cmd(0x00); + send_ctrl_cmd(0xD50D);send_data_cmd(0xA6); + send_ctrl_cmd(0xD50E);send_data_cmd(0x00); + send_ctrl_cmd(0xD50F);send_data_cmd(0xE5); + send_ctrl_cmd(0xD510);send_data_cmd(0x01); + send_ctrl_cmd(0xD511);send_data_cmd(0x13); + send_ctrl_cmd(0xD512);send_data_cmd(0x01); + send_ctrl_cmd(0xD513);send_data_cmd(0x54); + send_ctrl_cmd(0xD514);send_data_cmd(0x01); + send_ctrl_cmd(0xD515);send_data_cmd(0x82); + send_ctrl_cmd(0xD516);send_data_cmd(0x01); + send_ctrl_cmd(0xD517);send_data_cmd(0xCA); + send_ctrl_cmd(0xD518);send_data_cmd(0x02); + send_ctrl_cmd(0xD519);send_data_cmd(0x00); + send_ctrl_cmd(0xD51A);send_data_cmd(0x02); + send_ctrl_cmd(0xD51B);send_data_cmd(0x01); + send_ctrl_cmd(0xD51C);send_data_cmd(0x02); + send_ctrl_cmd(0xD51D);send_data_cmd(0x34); + send_ctrl_cmd(0xD51E);send_data_cmd(0x02); + send_ctrl_cmd(0xD51F);send_data_cmd(0x67); + send_ctrl_cmd(0xD520);send_data_cmd(0x02); + send_ctrl_cmd(0xD521);send_data_cmd(0x84); + send_ctrl_cmd(0xD522);send_data_cmd(0x02); + send_ctrl_cmd(0xD523);send_data_cmd(0xA4); + send_ctrl_cmd(0xD524);send_data_cmd(0x02); + send_ctrl_cmd(0xD525);send_data_cmd(0xB7); + send_ctrl_cmd(0xD526);send_data_cmd(0x02); + send_ctrl_cmd(0xD527);send_data_cmd(0xCF); + send_ctrl_cmd(0xD528);send_data_cmd(0x02); + send_ctrl_cmd(0xD529);send_data_cmd(0xDE); + send_ctrl_cmd(0xD52A);send_data_cmd(0x02); + send_ctrl_cmd(0xD52B);send_data_cmd(0xF2); + send_ctrl_cmd(0xD52C);send_data_cmd(0x02); + send_ctrl_cmd(0xD52D);send_data_cmd(0xFE); + send_ctrl_cmd(0xD52E);send_data_cmd(0x03); + send_ctrl_cmd(0xD52F);send_data_cmd(0x10); + send_ctrl_cmd(0xD530);send_data_cmd(0x03); + send_ctrl_cmd(0xD531);send_data_cmd(0x33); + send_ctrl_cmd(0xD532);send_data_cmd(0x03); + send_ctrl_cmd(0xD533);send_data_cmd(0x6D); + + send_ctrl_cmd(0xD600);send_data_cmd(0x00); + send_ctrl_cmd(0xD601);send_data_cmd(0x33); + send_ctrl_cmd(0xD602);send_data_cmd(0x00); + send_ctrl_cmd(0xD603);send_data_cmd(0x34); + send_ctrl_cmd(0xD604);send_data_cmd(0x00); + send_ctrl_cmd(0xD605);send_data_cmd(0x3A); + send_ctrl_cmd(0xD606);send_data_cmd(0x00); + send_ctrl_cmd(0xD607);send_data_cmd(0x4A); + send_ctrl_cmd(0xD608);send_data_cmd(0x00); + send_ctrl_cmd(0xD609);send_data_cmd(0x5C); + send_ctrl_cmd(0xD60A);send_data_cmd(0x00); + send_ctrl_cmd(0xD60B);send_data_cmd(0x81); + send_ctrl_cmd(0xD60C);send_data_cmd(0x00); + send_ctrl_cmd(0xD60D);send_data_cmd(0xA6); + send_ctrl_cmd(0xD60E);send_data_cmd(0x00); + send_ctrl_cmd(0xD60F);send_data_cmd(0xE5); + send_ctrl_cmd(0xD610);send_data_cmd(0x01); + send_ctrl_cmd(0xD611);send_data_cmd(0x13); + send_ctrl_cmd(0xD612);send_data_cmd(0x01); + send_ctrl_cmd(0xD613);send_data_cmd(0x54); + send_ctrl_cmd(0xD614);send_data_cmd(0x01); + send_ctrl_cmd(0xD615);send_data_cmd(0x82); + send_ctrl_cmd(0xD616);send_data_cmd(0x01); + send_ctrl_cmd(0xD617);send_data_cmd(0xCA); + send_ctrl_cmd(0xD618);send_data_cmd(0x02); + send_ctrl_cmd(0xD619);send_data_cmd(0x00); + send_ctrl_cmd(0xD61A);send_data_cmd(0x02); + send_ctrl_cmd(0xD61B);send_data_cmd(0x01); + send_ctrl_cmd(0xD61C);send_data_cmd(0x02); + send_ctrl_cmd(0xD61D);send_data_cmd(0x34); + send_ctrl_cmd(0xD61E);send_data_cmd(0x02); + send_ctrl_cmd(0xD61F);send_data_cmd(0x67); + send_ctrl_cmd(0xD620);send_data_cmd(0x02); + send_ctrl_cmd(0xD621);send_data_cmd(0x84); + send_ctrl_cmd(0xD622);send_data_cmd(0x02); + send_ctrl_cmd(0xD623);send_data_cmd(0xA4); + send_ctrl_cmd(0xD624);send_data_cmd(0x02); + send_ctrl_cmd(0xD625);send_data_cmd(0xB7); + send_ctrl_cmd(0xD626);send_data_cmd(0x02); + send_ctrl_cmd(0xD627);send_data_cmd(0xCF); + send_ctrl_cmd(0xD628);send_data_cmd(0x02); + send_ctrl_cmd(0xD629);send_data_cmd(0xDE); + send_ctrl_cmd(0xD62A);send_data_cmd(0x02); + send_ctrl_cmd(0xD62B);send_data_cmd(0xF2); + send_ctrl_cmd(0xD62C);send_data_cmd(0x02); + send_ctrl_cmd(0xD62D);send_data_cmd(0xFE); + send_ctrl_cmd(0xD62E);send_data_cmd(0x03); + send_ctrl_cmd(0xD62F);send_data_cmd(0x10); + send_ctrl_cmd(0xD630);send_data_cmd(0x03); + send_ctrl_cmd(0xD631);send_data_cmd(0x33); + send_ctrl_cmd(0xD632);send_data_cmd(0x03); + send_ctrl_cmd(0xD633);send_data_cmd(0x6D); + //*/ + + + //ENABLE PAGE 0 + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x00); + + //SOURCE OUTPUT DATA HOLD TIME + send_ctrl_cmd(0xB600);send_data_cmd(0x05); + + send_ctrl_cmd(0xB700);send_data_cmd(0x70); + send_ctrl_cmd(0xB701);send_data_cmd(0x70); + + //RAM KEEP + send_ctrl_cmd(0xB100);send_data_cmd(0xCC); + send_ctrl_cmd(0xB101);send_data_cmd(0x00); + //INVERSION + send_ctrl_cmd(0xBC00);send_data_cmd(0x02); + send_ctrl_cmd(0xBC01);send_data_cmd(0x00); + send_ctrl_cmd(0xBC02);send_data_cmd(0x00); + //SOURCE EQ + send_ctrl_cmd(0xB800);send_data_cmd(0x01); + send_ctrl_cmd(0xB801);send_data_cmd(0x03); + send_ctrl_cmd(0xB802);send_data_cmd(0x03); + send_ctrl_cmd(0xB803);send_data_cmd(0x03); + + + //PORCH LINES + send_ctrl_cmd(0xBD00);send_data_cmd(0x00); + send_ctrl_cmd(0xBD01);send_data_cmd(0x78); + send_ctrl_cmd(0xBD02);send_data_cmd(0x07); + + send_ctrl_cmd(0xBE02);send_data_cmd(0x07); + send_ctrl_cmd(0xBE03);send_data_cmd(0x31); + send_ctrl_cmd(0xBF02);send_data_cmd(0x07); + send_ctrl_cmd(0xBF03);send_data_cmd(0x31); + + send_ctrl_cmd(0xFF00);send_data_cmd(0xAA); + send_ctrl_cmd(0xFF01);send_data_cmd(0x55); + send_ctrl_cmd(0xFF02);send_data_cmd(0x25); + send_ctrl_cmd(0xFF03);send_data_cmd(0x01); + + //send_ctrl_cmd(0xF304);send_data_cmd(0x11); + send_ctrl_cmd(0xF306);send_data_cmd(0x10); + send_ctrl_cmd(0xF408);send_data_cmd(0x00); + + //TE ON + send_ctrl_cmd(0x3500);send_data_cmd(0x00); + //OTHER SET + send_ctrl_cmd(0x3600);send_data_cmd(0x00); + send_ctrl_cmd(0x3A00);send_data_cmd(0x77); + //send_ctrl_cmd(0x2100); + //SLEEP OUT + send_ctrl_cmd(0x1100); + MDELAY(500); + //DISPLY ON + send_ctrl_cmd(0x2900); + MDELAY(100); +#endif +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN, + LSA0_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0);//input + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, 0); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; //LCM_POLARITY_FALLING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(20); + + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_get_byte(0xc0); //spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_get_byte(0xc0); //spi_read_data(); + + id = (id1<<8)|id2; + +#ifdef BUILD_UBOOT + printf("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#else + printk("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#endif + + return (LCM_ID == id)?1:0; +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(350); + send_ctrl_cmd(0x2900); + MDELAY(100); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER n3p4527_wvga_nt35510_lcm_drv = +{ + + .name = "n3p4527_wvga_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id, +}; diff --git a/acer_e350_simcom75/lcm/n618_wvga_nt35510/n618_wvga_nt35510.c b/acer_e350_simcom75/lcm/n618_wvga_nt35510/n618_wvga_nt35510.c new file mode 100644 index 0000000..92b42d9 --- /dev/null +++ b/acer_e350_simcom75/lcm/n618_wvga_nt35510/n618_wvga_nt35510.c @@ -0,0 +1,850 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define NT35510_LCM_ID 0x5510 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#if 1 +static __inline unsigned char spi_get_byte(unsigned int reg) +{ + unsigned int i; + int k; + unsigned char getbyte=0; + + // reg = (CTRL_ID | (reg & 0xFF)); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + SET_LSCE_LOW; + UDELAY(1); + + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (reg & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + reg <<= 1; + } + + UDELAY(2); + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + SET_LSCK_HIGH; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte |= (1 << k); + } + + } + + UDELAY(2); + + SET_LSDA_HIGH; + SET_LSCE_HIGH; + + return getbyte; +} +#else +static __inline unsigned char spi_get_data(void) +{ + unsigned int i; + int k; + unsigned char package=0xC0,reg_value=0; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + UDELAY(1); + if (package & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + package <<= 1; + } + + for(k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(2); + + if(GET_LSA0_BIT) + { + reg_value |= (1 << k); + } + SET_LSCK_HIGH; + UDELAY(2); + } + + SET_LSCE_HIGH; + SET_LSDA_HIGH; + + return reg_value; +} +#endif + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +//ENABLE PAGE 1 +set_lcm_register(0xF000,0x55); +set_lcm_register(0xF001,0xAA); +set_lcm_register(0xF002,0x52); +set_lcm_register(0xF003,0x08); +set_lcm_register(0xF004,0x00); +set_lcm_register(0xB100,0x0C); +set_lcm_register(0xB101,0x00); + +//VGMP/VGMN/VCOM SETING +set_lcm_register(0xBC00,0x05); +set_lcm_register(0xBC01,0x05); +set_lcm_register(0xBC02,0x05); + set_lcm_register(0xBD02,0x07); + set_lcm_register(0xBD03,0x1c); //31 +set_lcm_register(0xF000,0x55); +set_lcm_register(0xF001,0xAA); +set_lcm_register(0xF002,0x52); +set_lcm_register(0xF003,0x08); +set_lcm_register(0xF004,0x01); + +//BGH VOLTAGE SETTING +set_lcm_register(0xB900,0x24); +set_lcm_register(0xB901,0x24); +set_lcm_register(0xB902,0x24); + +//VGLX VOLTAGE SETTING +set_lcm_register(0xBA00,0x24); +set_lcm_register(0xBA01,0x24); +set_lcm_register(0xBA02,0x24); +set_lcm_register(0xBE00,0x00);//40 +set_lcm_register(0xBE01,0x78);//78 + +//Z-INVERSION +set_lcm_register(0xBC00,0x00); +set_lcm_register(0xBC01,0x88); +set_lcm_register(0xBC02,0x01); +set_lcm_register(0xBD00,0x00); +set_lcm_register(0xBD01,0x88); +set_lcm_register(0xBD02,0x01); + +//GAMMA SETING RED +set_lcm_register(0xD100,0x00); +set_lcm_register(0xD101,0x00); +set_lcm_register(0xD102,0x00); +set_lcm_register(0xD103,0x16); +set_lcm_register(0xD104,0x00); +set_lcm_register(0xD105,0x42); +set_lcm_register(0xD106,0x00); +set_lcm_register(0xD107,0x61); +set_lcm_register(0xD108,0x00); +set_lcm_register(0xD109,0x74); +set_lcm_register(0xD10A,0x00); +set_lcm_register(0xD10B,0x97); +set_lcm_register(0xD10C,0x00); +set_lcm_register(0xD10D,0xAD); +set_lcm_register(0xD10E,0x00); +set_lcm_register(0xD10F,0xDE); +set_lcm_register(0xD110,0x01); +set_lcm_register(0xD111,0x00); +set_lcm_register(0xD112,0x01); +set_lcm_register(0xD113,0x26); +set_lcm_register(0xD114,0x01); +set_lcm_register(0xD115,0x50); +set_lcm_register(0xD116,0x01); +set_lcm_register(0xD117,0x87); +set_lcm_register(0xD118,0x01); +set_lcm_register(0xD119,0xB3); +set_lcm_register(0xD11A,0x01); +set_lcm_register(0xD11B,0xB6); +set_lcm_register(0xD11C,0x01); +set_lcm_register(0xD11D,0xDC); +set_lcm_register(0xD11E,0x02); +set_lcm_register(0xD11F,0x04); +set_lcm_register(0xD120,0x02); +set_lcm_register(0xD121,0x1C); +set_lcm_register(0xD122,0x02); +set_lcm_register(0xD123,0x34); +set_lcm_register(0xD124,0x02); +set_lcm_register(0xD125,0x4E); +set_lcm_register(0xD126,0x02); +set_lcm_register(0xD127,0x8A); +set_lcm_register(0xD128,0x02); +set_lcm_register(0xD129,0xC2); +set_lcm_register(0xD12A,0x03); +set_lcm_register(0xD12B,0x04); +set_lcm_register(0xD12C,0x03); +set_lcm_register(0xD12D,0x2E); +set_lcm_register(0xD12E,0x03); +set_lcm_register(0xD12F,0x74); +set_lcm_register(0xD130,0x03); +set_lcm_register(0xD131,0xEB); +set_lcm_register(0xD132,0x03); +set_lcm_register(0xD133,0xFF); + +//GAMMA SETING RED +set_lcm_register(0xD200,0x00); +set_lcm_register(0xD201,0x00); +set_lcm_register(0xD202,0x00); +set_lcm_register(0xD203,0x16); +set_lcm_register(0xD204,0x00); +set_lcm_register(0xD205,0x42); +set_lcm_register(0xD206,0x00); +set_lcm_register(0xD207,0x61); +set_lcm_register(0xD208,0x00); +set_lcm_register(0xD209,0x74); +set_lcm_register(0xD20A,0x00); +set_lcm_register(0xD20B,0x97); +set_lcm_register(0xD20C,0x00); +set_lcm_register(0xD20D,0xAD); +set_lcm_register(0xD20E,0x00); +set_lcm_register(0xD20F,0xDE); +set_lcm_register(0xD210,0x01); +set_lcm_register(0xD211,0x00); +set_lcm_register(0xD212,0x01); +set_lcm_register(0xD213,0x26); +set_lcm_register(0xD214,0x01); +set_lcm_register(0xD215,0x50); +set_lcm_register(0xD216,0x01); +set_lcm_register(0xD217,0x87); +set_lcm_register(0xD218,0x01); +set_lcm_register(0xD219,0xB3); +set_lcm_register(0xD21A,0x01); +set_lcm_register(0xD21B,0xB6); +set_lcm_register(0xD21C,0x01); +set_lcm_register(0xD21D,0xDC); +set_lcm_register(0xD21E,0x02); +set_lcm_register(0xD21F,0x04); +set_lcm_register(0xD220,0x02); +set_lcm_register(0xD221,0x1C); +set_lcm_register(0xD222,0x02); +set_lcm_register(0xD223,0x34); +set_lcm_register(0xD224,0x02); +set_lcm_register(0xD225,0x4E); +set_lcm_register(0xD226,0x02); +set_lcm_register(0xD227,0x8A); +set_lcm_register(0xD228,0x02); +set_lcm_register(0xD229,0xC2); +set_lcm_register(0xD22A,0x03); +set_lcm_register(0xD22B,0x04); +set_lcm_register(0xD22C,0x03); +set_lcm_register(0xD22D,0x2E); +set_lcm_register(0xD22E,0x03); +set_lcm_register(0xD22F,0x74); +set_lcm_register(0xD230,0x03); +set_lcm_register(0xD231,0xEB); +set_lcm_register(0xD232,0x03); +set_lcm_register(0xD233,0xFF); + + +//GAMMA SETING RED +set_lcm_register(0xD300,0x00); +set_lcm_register(0xD301,0x00); +set_lcm_register(0xD302,0x00); +set_lcm_register(0xD303,0x16); +set_lcm_register(0xD304,0x00); +set_lcm_register(0xD305,0x42); +set_lcm_register(0xD306,0x00); +set_lcm_register(0xD307,0x61); +set_lcm_register(0xD308,0x00); +set_lcm_register(0xD309,0x74); +set_lcm_register(0xD30A,0x00); +set_lcm_register(0xD30B,0x97); +set_lcm_register(0xD30C,0x00); +set_lcm_register(0xD30D,0xAD); +set_lcm_register(0xD30E,0x00); +set_lcm_register(0xD30F,0xDE); +set_lcm_register(0xD310,0x01); +set_lcm_register(0xD311,0x00); +set_lcm_register(0xD312,0x01); +set_lcm_register(0xD313,0x26); +set_lcm_register(0xD314,0x01); +set_lcm_register(0xD315,0x50); +set_lcm_register(0xD316,0x01); +set_lcm_register(0xD317,0x87); +set_lcm_register(0xD318,0x01); +set_lcm_register(0xD319,0xB3); +set_lcm_register(0xD31A,0x01); +set_lcm_register(0xD31B,0xB6); +set_lcm_register(0xD31C,0x01); +set_lcm_register(0xD31D,0xDC); +set_lcm_register(0xD31E,0x02); +set_lcm_register(0xD31F,0x04); +set_lcm_register(0xD320,0x02); +set_lcm_register(0xD321,0x1C); +set_lcm_register(0xD322,0x02); +set_lcm_register(0xD323,0x34); +set_lcm_register(0xD324,0x02); +set_lcm_register(0xD325,0x4E); +set_lcm_register(0xD326,0x02); +set_lcm_register(0xD327,0x8A); +set_lcm_register(0xD328,0x02); +set_lcm_register(0xD329,0xC2); +set_lcm_register(0xD32A,0x03); +set_lcm_register(0xD32B,0x04); +set_lcm_register(0xD32C,0x03); +set_lcm_register(0xD32D,0x2E); +set_lcm_register(0xD32E,0x03); +set_lcm_register(0xD32F,0x74); +set_lcm_register(0xD330,0x03); +set_lcm_register(0xD331,0xEB); +set_lcm_register(0xD332,0x03); +set_lcm_register(0xD333,0xFF); + + +//GAMMA SETING RED +set_lcm_register(0xD400,0x00); +set_lcm_register(0xD401,0x00); +set_lcm_register(0xD402,0x00); +set_lcm_register(0xD403,0x16); +set_lcm_register(0xD404,0x00); +set_lcm_register(0xD405,0x42); +set_lcm_register(0xD406,0x00); +set_lcm_register(0xD407,0x61); +set_lcm_register(0xD408,0x00); +set_lcm_register(0xD409,0x74); +set_lcm_register(0xD40A,0x00); +set_lcm_register(0xD40B,0x97); +set_lcm_register(0xD40C,0x00); +set_lcm_register(0xD40D,0xAD); +set_lcm_register(0xD40E,0x00); +set_lcm_register(0xD40F,0xDE); +set_lcm_register(0xD410,0x01); +set_lcm_register(0xD411,0x00); +set_lcm_register(0xD412,0x01); +set_lcm_register(0xD413,0x26); +set_lcm_register(0xD414,0x01); +set_lcm_register(0xD415,0x50); +set_lcm_register(0xD416,0x01); +set_lcm_register(0xD417,0x87); +set_lcm_register(0xD418,0x01); +set_lcm_register(0xD419,0xB3); +set_lcm_register(0xD41A,0x01); +set_lcm_register(0xD41B,0xB6); +set_lcm_register(0xD41C,0x01); +set_lcm_register(0xD41D,0xDC); +set_lcm_register(0xD41E,0x02); +set_lcm_register(0xD41F,0x04); +set_lcm_register(0xD420,0x02); +set_lcm_register(0xD421,0x1C); +set_lcm_register(0xD422,0x02); +set_lcm_register(0xD423,0x34); +set_lcm_register(0xD424,0x02); +set_lcm_register(0xD425,0x4E); +set_lcm_register(0xD426,0x02); +set_lcm_register(0xD427,0x8A); +set_lcm_register(0xD428,0x02); +set_lcm_register(0xD429,0xC2); +set_lcm_register(0xD42A,0x03); +set_lcm_register(0xD42B,0x04); +set_lcm_register(0xD42C,0x03); +set_lcm_register(0xD42D,0x2E); +set_lcm_register(0xD42E,0x03); +set_lcm_register(0xD42F,0x74); +set_lcm_register(0xD430,0x03); +set_lcm_register(0xD431,0xEB); +set_lcm_register(0xD432,0x03); +set_lcm_register(0xD433,0xFF); + + +//GAMMA SETING RED +set_lcm_register(0xD500,0x00); +set_lcm_register(0xD501,0x00); +set_lcm_register(0xD502,0x00); +set_lcm_register(0xD503,0x16); +set_lcm_register(0xD504,0x00); +set_lcm_register(0xD505,0x42); +set_lcm_register(0xD506,0x00); +set_lcm_register(0xD507,0x61); +set_lcm_register(0xD508,0x00); +set_lcm_register(0xD509,0x74); +set_lcm_register(0xD50A,0x00); +set_lcm_register(0xD50B,0x97); +set_lcm_register(0xD50C,0x00); +set_lcm_register(0xD50D,0xAD); +set_lcm_register(0xD50E,0x00); +set_lcm_register(0xD50F,0xDE); +set_lcm_register(0xD510,0x01); +set_lcm_register(0xD511,0x00); +set_lcm_register(0xD512,0x01); +set_lcm_register(0xD513,0x26); +set_lcm_register(0xD514,0x01); +set_lcm_register(0xD515,0x50); +set_lcm_register(0xD516,0x01); +set_lcm_register(0xD517,0x87); +set_lcm_register(0xD518,0x01); +set_lcm_register(0xD519,0xB3); +set_lcm_register(0xD51A,0x01); +set_lcm_register(0xD51B,0xB6); +set_lcm_register(0xD51C,0x01); +set_lcm_register(0xD51D,0xDC); +set_lcm_register(0xD51E,0x02); +set_lcm_register(0xD51F,0x04); +set_lcm_register(0xD520,0x02); +set_lcm_register(0xD521,0x1C); +set_lcm_register(0xD522,0x02); +set_lcm_register(0xD523,0x34); +set_lcm_register(0xD524,0x02); +set_lcm_register(0xD525,0x4E); +set_lcm_register(0xD526,0x02); +set_lcm_register(0xD527,0x8A); +set_lcm_register(0xD528,0x02); +set_lcm_register(0xD529,0xC2); +set_lcm_register(0xD52A,0x03); +set_lcm_register(0xD52B,0x04); +set_lcm_register(0xD52C,0x03); +set_lcm_register(0xD52D,0x2E); +set_lcm_register(0xD52E,0x03); +set_lcm_register(0xD52F,0x74); +set_lcm_register(0xD530,0x03); +set_lcm_register(0xD531,0xEB); +set_lcm_register(0xD532,0x03); +set_lcm_register(0xD533,0xFF); + + + +//GAMMA SETING RED +set_lcm_register(0xD600,0x00); +set_lcm_register(0xD601,0x00); +set_lcm_register(0xD602,0x00); +set_lcm_register(0xD603,0x16); +set_lcm_register(0xD604,0x00); +set_lcm_register(0xD605,0x42); +set_lcm_register(0xD606,0x00); +set_lcm_register(0xD607,0x61); +set_lcm_register(0xD608,0x00); +set_lcm_register(0xD609,0x74); +set_lcm_register(0xD60A,0x00); +set_lcm_register(0xD60B,0x97); +set_lcm_register(0xD60C,0x00); +set_lcm_register(0xD60D,0xAD); +set_lcm_register(0xD60E,0x00); +set_lcm_register(0xD60F,0xDE); +set_lcm_register(0xD610,0x01); +set_lcm_register(0xD611,0x00); +set_lcm_register(0xD612,0x01); +set_lcm_register(0xD613,0x26); +set_lcm_register(0xD614,0x01); +set_lcm_register(0xD615,0x50); +set_lcm_register(0xD616,0x01); +set_lcm_register(0xD617,0x87); +set_lcm_register(0xD618,0x01); +set_lcm_register(0xD619,0xB3); +set_lcm_register(0xD61A,0x01); +set_lcm_register(0xD61B,0xB6); +set_lcm_register(0xD61C,0x01); +set_lcm_register(0xD61D,0xDC); +set_lcm_register(0xD61E,0x02); +set_lcm_register(0xD61F,0x04); +set_lcm_register(0xD620,0x02); +set_lcm_register(0xD621,0x1C); +set_lcm_register(0xD622,0x02); +set_lcm_register(0xD623,0x34); +set_lcm_register(0xD624,0x02); +set_lcm_register(0xD625,0x4E); +set_lcm_register(0xD626,0x02); +set_lcm_register(0xD627,0x8A); +set_lcm_register(0xD628,0x02); +set_lcm_register(0xD629,0xC2); +set_lcm_register(0xD62A,0x03); +set_lcm_register(0xD62B,0x04); +set_lcm_register(0xD62C,0x03); +set_lcm_register(0xD62D,0x2E); +set_lcm_register(0xD62E,0x03); +set_lcm_register(0xD62F,0x74); +set_lcm_register(0xD630,0x03); +set_lcm_register(0xD631,0xEB); +set_lcm_register(0xD632,0x03); +set_lcm_register(0xD633,0xFF); + send_ctrl_cmd(0x1100);//Sleep out + MDELAY(300); + + send_ctrl_cmd(0x2900);//Display on + MDELAY(200); + +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + // lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0);//input + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, 0); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + +static void lcm_suspend(void) +{ +#ifdef BUILD_UBOOT + //printf("1111111111lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#else + //printk("11111111111lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#endif + + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(150); + send_ctrl_cmd(0x2900); + MDELAY(100); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + +#if 1 + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); + + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_get_byte(0xc0); //spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_get_byte(0xc0); //spi_read_data(); + + id = (id1<<8)|id2; + +#ifdef BUILD_UBOOT + printf("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#else + printk("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#endif +#else + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(50); + + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_get_data(); //spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_get_data(); //spi_read_data(); + + id = (id1<<8)|id2; + +#ifdef BUILD_UBOOT + printf("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#else + printk("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#endif + +#endif + return (NT35510_LCM_ID == id)?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER n618_wvga_nt35510_lcm_drv = +{ + + .name = "n618_wvga_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id, +}; diff --git a/acer_e350_simcom75/lcm/nt35516/nt35516.c b/acer_e350_simcom75/lcm/nt35516/nt35516.c new file mode 100644 index 0000000..f564c38 --- /dev/null +++ b/acer_e350_simcom75/lcm/nt35516/nt35516.c @@ -0,0 +1,1566 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + + +#ifdef BUILD_UBOOT +#define LCD_PRINT printf +#else +#define LCD_PRINT printk +#endif + + +//#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#if 0 +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#else +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) +#endif +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + + +#define PARA_MAX 40 +struct init_para_st +{ + unsigned short reg_start; + unsigned short para_cnt; + unsigned char parameters[PARA_MAX]; +}; + +static struct init_para_st init_setting[] = +{ + { + 0xff00,5, + { + 0xaa,0x55,0x25,0x01,0x01, + } + }, + { + 0xF200,35, + { + 0x00, 0x00, 0x4A, 0x0A, 0xA8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x51, 0x00, + 0x01, 0x00, 0x01, + } + }, + { + 0xF300,7, + { + 0x02, 0x03, 0x07, 0x45, 0x88, 0xD1, 0x0D, + } + }, + { + 0xF000,5, + { + 0x55, 0xAA, 0x52, 0x08, 0x00 + } + }, + { + 0xB100,3, + { + 0xCC, 0x00, 0x00, + } + }, + { + 0xB800,4, + { + 0x01, 0x02, 0x02, 0x02, + } + }, + { + 0xC900,6, + { + 0x63, 0x06, 0x0D, 0x1A, 0x17, 0x00, + } + }, + { + 0xF000,5, + { + 0x55, 0xAA, 0x52, 0x08, 0x01, + } + }, + { + 0xB000,3, + { + 0x05, 0x05, 0x05, + } + }, + { + 0xB100,3, + { + 0x05, 0x05, 0x05, + } + }, + { + 0xB200,3, + { + 0x01, 0x01, 0x01, + } + }, + { + 0xB300,3, + { + 0x0E, 0x0E, 0x0E, + } + }, + { + 0xB400,3, + { + 0x08, 0x08, 0x08, + } + }, + { + 0xB600,3, + { + 0x44, 0x44, 0x44, + } + }, + { + 0xB700,3, + { + 0x34, 0x34, 0x34, + } + }, + { + 0xB800,3, + { + 0x10, 0x10, 0x10, + } + }, + { + 0xB900,3, + { + 0x26, 0x26, 0x26, + } + }, + { + 0xBA00,3, + { + 0x34, 0x34, 0x34, + } + }, + { + 0xBC00,3, + { + 0x00, 0xC8, 0x00, + } + }, + { + 0xBD00,3, + { + 0x00, 0xC8, 0x00, + } + }, + { + 0xBE00,1, + { + 0x92, + } + }, + { + 0xC000,2, + { + 0x04, 0x00, + } + }, + { + 0xCA00,1, + { + 0x00, + } + }, + { + 0xD000,4, + { + 0x0A, 0x10, 0x0D, 0x0F, + } + }, + { + 0xD100,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xD200,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xD300,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xD400,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xD500,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xD600,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xD700,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xD800,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xD900,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xDD00,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xDE00,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xDF00,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE000,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE100,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xE200,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xE300,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE400,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE500,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xE600,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xE700,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE800,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE900,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xEA00,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xEB00,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + } +}; + + +static int init_setting_num = sizeof(init_setting)/sizeof(init_setting[0]); + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + //unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + int i,k; +#if 0 + for(i=0; itype = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 57;//40?, punk 42->54 57(38M) + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + +#if 1 + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; +#else + params->dpi.hsync_pulse_width = 12; + params->dpi.hsync_back_porch = 8; + params->dpi.hsync_front_porch = 8; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 8; + params->dpi.vsync_front_porch = 8; +#endif + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current =LCM_DRIVING_CURRENT_6575_4MA;// LCM_DRIVING_CURRENT_6575_4MA; //punk LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_hw_reset(void) +{ + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); +LCD_PRINT("punk,lcm_hw_reset -1 "); + MDELAY(60); +LCD_PRINT("punk,lcm_hw_reset -2 "); + SET_RESET_PIN(1); + MDELAY(80); +} + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(80); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(150); + send_ctrl_cmd(0x4f00); + send_data_cmd(0x01); //DSTB + +} + + +static void lcm_resume(void) +{ +#if 0 + LCD_PRINT("punk,lcm_resume -1 "); + return;//punk + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(100); +#else + lcm_hw_reset(); + init_lcm_registers(); +#endif +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER nt35516_lcm_drv = +{ + + .name = "nt35516", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/acer_e350_simcom75/lcm/nt35565_3D/nt35565_3d.c b/acer_e350_simcom75/lcm/nt35565_3D/nt35565_3d.c new file mode 100644 index 0000000..06c24d1 --- /dev/null +++ b/acer_e350_simcom75/lcm/nt35565_3D/nt35565_3d.c @@ -0,0 +1,384 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x55, 1, {0x02}}, + {REGFLAG_DELAY, 1, {}}, + + {0x53, 1, {0x2C}}, + {REGFLAG_DELAY, 1, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {REGFLAG_DELAY, 1, {}}, + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x51, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + // LCM driver IC specifies 15ms needed after sleep out. But we need more delay time to make sure latest RAM data has been refreshed to screen. + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + // NT35565 accept maximum 510Mbps + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + // Work around for Novatek driver IC. If it entered ULP mode, it must be reset before resume. + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +*/ +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/acer_e350_simcom75/lcm/nt35582_mcu/nt35582_mcu.c b/acer_e350_simcom75/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..58732b6 --- /dev/null +++ b/acer_e350_simcom75/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,464 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; //note:this para is different between 6573 and 6575 + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.read_latency = 0; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c b/acer_e350_simcom75/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c new file mode 100644 index 0000000..b79e79b --- /dev/null +++ b/acer_e350_simcom75/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c @@ -0,0 +1,465 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->io_select_mode = 1; //note:this para is different between 6573 and 6575 + + + params->dbi.port = 0; //DBI port must be 0 or 1 on mt6575, should not be 2 + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 4; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_6575_lcm_drv = +{ + .name = "nt35582_mcu_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c b/acer_e350_simcom75/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c new file mode 100644 index 0000000..ce5498d --- /dev/null +++ b/acer_e350_simcom75/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c @@ -0,0 +1,426 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +/* +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) +*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} + +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +}*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_div1 = 0x15; + params->dpi.mipi_pll_clk_div2 = 5; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB565; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + + params->dbi.serial.css = 2; + params->dbi.serial.csh = 2; + params->dbi.serial.rd_1st = 2; + params->dbi.serial.rd_2nd = 2; + params->dbi.serial.wr_1st = 2; + params->dbi.serial.wr_2nd = 2; + params->dbi.serial.sif_3wire = 0; + params->dbi.serial.sif_sdi = 0; + + params->dbi.serial.sif_1st_pol = 0; + params->dbi.serial.sif_sck_def = 0; + params->dbi.serial.sif_div2 = 0; + params->dbi.serial.sif_hw_cs = 1; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + params->dpi.i2x_en = 0; + params->dpi.i2x_edge = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +// config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +// config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ +// config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER nt35582_rgb_6575_lcm_drv = +{ + .name = "nt35582_rgb_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/acer_e350_simcom75/lcm/p2498_wvga_nt35510/p2498_wvga_nt35510.c b/acer_e350_simcom75/lcm/p2498_wvga_nt35510/p2498_wvga_nt35510.c new file mode 100644 index 0000000..cac583b --- /dev/null +++ b/acer_e350_simcom75/lcm/p2498_wvga_nt35510/p2498_wvga_nt35510.c @@ -0,0 +1,785 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + + +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x5510 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_read_data(void) +{ + unsigned int i; + int k=0; + unsigned int getbyte1=0; + unsigned int data=0; + +#ifdef BUILD_UBOOT + printf("spi_read_data \r\n"); +#endif + + data = 0xc0; + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + SET_LA0_INPUT; + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 7)) + { + SET_LSDA_HIGH; + } + else + { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } +#if 0 + for(i=8;i>0;i--) + { + SET_LSCK_LOW; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#endif + UDELAY(5); + for (k = 7; k >=0; k--) + { + SET_LSCK_LOW; + if (GET_LSA0_BIT) + { + getbyte1 |= (1 << k); + } + + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#ifdef BUILD_UBOOT + printf("getbyte1=0x%x \r\n",getbyte1); +#endif + SET_LSDA_HIGH; + SET_LSCE_HIGH; + return getbyte1; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +//ENABLE PAGE 1 +set_lcm_register(0xF000,0x55); +set_lcm_register(0xF001,0xAA); +set_lcm_register(0xF002,0x52); +set_lcm_register(0xF003,0x08); +set_lcm_register(0xF004,0x00); +set_lcm_register(0xB100,0x0C); +set_lcm_register(0xB101,0x00); + +//VGMP/VGMN/VCOM SETING +set_lcm_register(0xBC00,0x05); +set_lcm_register(0xBC01,0x05); +set_lcm_register(0xBC02,0x05); +set_lcm_register(0xF000,0x55); +set_lcm_register(0xF001,0xAA); +set_lcm_register(0xF002,0x52); +set_lcm_register(0xF003,0x08); +set_lcm_register(0xF004,0x01); + +//BGH VOLTAGE SETTING +set_lcm_register(0xB900,0x24); +set_lcm_register(0xB901,0x24); +set_lcm_register(0xB902,0x24); + +//VGLX VOLTAGE SETTING +set_lcm_register(0xBA00,0x24); +set_lcm_register(0xBA01,0x24); +set_lcm_register(0xBA02,0x24); +set_lcm_register(0xBE00,0x00);//40 +set_lcm_register(0xBE01,0x78);//78 + +//Z-INVERSION +set_lcm_register(0xBC00,0x00); +set_lcm_register(0xBC01,0x88); +set_lcm_register(0xBC02,0x01); +set_lcm_register(0xBD00,0x00); +set_lcm_register(0xBD01,0x88); +set_lcm_register(0xBD02,0x01); + +//GAMMA SETING RED +set_lcm_register(0xD100,0x00); +set_lcm_register(0xD101,0x00); +set_lcm_register(0xD102,0x00); +set_lcm_register(0xD103,0x16); +set_lcm_register(0xD104,0x00); +set_lcm_register(0xD105,0x42); +set_lcm_register(0xD106,0x00); +set_lcm_register(0xD107,0x61); +set_lcm_register(0xD108,0x00); +set_lcm_register(0xD109,0x74); +set_lcm_register(0xD10A,0x00); +set_lcm_register(0xD10B,0x97); +set_lcm_register(0xD10C,0x00); +set_lcm_register(0xD10D,0xAD); +set_lcm_register(0xD10E,0x00); +set_lcm_register(0xD10F,0xDE); +set_lcm_register(0xD110,0x01); +set_lcm_register(0xD111,0x00); +set_lcm_register(0xD112,0x01); +set_lcm_register(0xD113,0x26); +set_lcm_register(0xD114,0x01); +set_lcm_register(0xD115,0x50); +set_lcm_register(0xD116,0x01); +set_lcm_register(0xD117,0x87); +set_lcm_register(0xD118,0x01); +set_lcm_register(0xD119,0xB3); +set_lcm_register(0xD11A,0x01); +set_lcm_register(0xD11B,0xB6); +set_lcm_register(0xD11C,0x01); +set_lcm_register(0xD11D,0xDC); +set_lcm_register(0xD11E,0x02); +set_lcm_register(0xD11F,0x04); +set_lcm_register(0xD120,0x02); +set_lcm_register(0xD121,0x1C); +set_lcm_register(0xD122,0x02); +set_lcm_register(0xD123,0x34); +set_lcm_register(0xD124,0x02); +set_lcm_register(0xD125,0x4E); +set_lcm_register(0xD126,0x02); +set_lcm_register(0xD127,0x8A); +set_lcm_register(0xD128,0x02); +set_lcm_register(0xD129,0xC2); +set_lcm_register(0xD12A,0x03); +set_lcm_register(0xD12B,0x04); +set_lcm_register(0xD12C,0x03); +set_lcm_register(0xD12D,0x2E); +set_lcm_register(0xD12E,0x03); +set_lcm_register(0xD12F,0x74); +set_lcm_register(0xD130,0x03); +set_lcm_register(0xD131,0xEB); +set_lcm_register(0xD132,0x03); +set_lcm_register(0xD133,0xFF); + +//GAMMA SETING RED +set_lcm_register(0xD200,0x00); +set_lcm_register(0xD201,0x00); +set_lcm_register(0xD202,0x00); +set_lcm_register(0xD203,0x16); +set_lcm_register(0xD204,0x00); +set_lcm_register(0xD205,0x42); +set_lcm_register(0xD206,0x00); +set_lcm_register(0xD207,0x61); +set_lcm_register(0xD208,0x00); +set_lcm_register(0xD209,0x74); +set_lcm_register(0xD20A,0x00); +set_lcm_register(0xD20B,0x97); +set_lcm_register(0xD20C,0x00); +set_lcm_register(0xD20D,0xAD); +set_lcm_register(0xD20E,0x00); +set_lcm_register(0xD20F,0xDE); +set_lcm_register(0xD210,0x01); +set_lcm_register(0xD211,0x00); +set_lcm_register(0xD212,0x01); +set_lcm_register(0xD213,0x26); +set_lcm_register(0xD214,0x01); +set_lcm_register(0xD215,0x50); +set_lcm_register(0xD216,0x01); +set_lcm_register(0xD217,0x87); +set_lcm_register(0xD218,0x01); +set_lcm_register(0xD219,0xB3); +set_lcm_register(0xD21A,0x01); +set_lcm_register(0xD21B,0xB6); +set_lcm_register(0xD21C,0x01); +set_lcm_register(0xD21D,0xDC); +set_lcm_register(0xD21E,0x02); +set_lcm_register(0xD21F,0x04); +set_lcm_register(0xD220,0x02); +set_lcm_register(0xD221,0x1C); +set_lcm_register(0xD222,0x02); +set_lcm_register(0xD223,0x34); +set_lcm_register(0xD224,0x02); +set_lcm_register(0xD225,0x4E); +set_lcm_register(0xD226,0x02); +set_lcm_register(0xD227,0x8A); +set_lcm_register(0xD228,0x02); +set_lcm_register(0xD229,0xC2); +set_lcm_register(0xD22A,0x03); +set_lcm_register(0xD22B,0x04); +set_lcm_register(0xD22C,0x03); +set_lcm_register(0xD22D,0x2E); +set_lcm_register(0xD22E,0x03); +set_lcm_register(0xD22F,0x74); +set_lcm_register(0xD230,0x03); +set_lcm_register(0xD231,0xEB); +set_lcm_register(0xD232,0x03); +set_lcm_register(0xD233,0xFF); + + +//GAMMA SETING RED +set_lcm_register(0xD300,0x00); +set_lcm_register(0xD301,0x00); +set_lcm_register(0xD302,0x00); +set_lcm_register(0xD303,0x16); +set_lcm_register(0xD304,0x00); +set_lcm_register(0xD305,0x42); +set_lcm_register(0xD306,0x00); +set_lcm_register(0xD307,0x61); +set_lcm_register(0xD308,0x00); +set_lcm_register(0xD309,0x74); +set_lcm_register(0xD30A,0x00); +set_lcm_register(0xD30B,0x97); +set_lcm_register(0xD30C,0x00); +set_lcm_register(0xD30D,0xAD); +set_lcm_register(0xD30E,0x00); +set_lcm_register(0xD30F,0xDE); +set_lcm_register(0xD310,0x01); +set_lcm_register(0xD311,0x00); +set_lcm_register(0xD312,0x01); +set_lcm_register(0xD313,0x26); +set_lcm_register(0xD314,0x01); +set_lcm_register(0xD315,0x50); +set_lcm_register(0xD316,0x01); +set_lcm_register(0xD317,0x87); +set_lcm_register(0xD318,0x01); +set_lcm_register(0xD319,0xB3); +set_lcm_register(0xD31A,0x01); +set_lcm_register(0xD31B,0xB6); +set_lcm_register(0xD31C,0x01); +set_lcm_register(0xD31D,0xDC); +set_lcm_register(0xD31E,0x02); +set_lcm_register(0xD31F,0x04); +set_lcm_register(0xD320,0x02); +set_lcm_register(0xD321,0x1C); +set_lcm_register(0xD322,0x02); +set_lcm_register(0xD323,0x34); +set_lcm_register(0xD324,0x02); +set_lcm_register(0xD325,0x4E); +set_lcm_register(0xD326,0x02); +set_lcm_register(0xD327,0x8A); +set_lcm_register(0xD328,0x02); +set_lcm_register(0xD329,0xC2); +set_lcm_register(0xD32A,0x03); +set_lcm_register(0xD32B,0x04); +set_lcm_register(0xD32C,0x03); +set_lcm_register(0xD32D,0x2E); +set_lcm_register(0xD32E,0x03); +set_lcm_register(0xD32F,0x74); +set_lcm_register(0xD330,0x03); +set_lcm_register(0xD331,0xEB); +set_lcm_register(0xD332,0x03); +set_lcm_register(0xD333,0xFF); + + +//GAMMA SETING RED +set_lcm_register(0xD400,0x00); +set_lcm_register(0xD401,0x00); +set_lcm_register(0xD402,0x00); +set_lcm_register(0xD403,0x16); +set_lcm_register(0xD404,0x00); +set_lcm_register(0xD405,0x42); +set_lcm_register(0xD406,0x00); +set_lcm_register(0xD407,0x61); +set_lcm_register(0xD408,0x00); +set_lcm_register(0xD409,0x74); +set_lcm_register(0xD40A,0x00); +set_lcm_register(0xD40B,0x97); +set_lcm_register(0xD40C,0x00); +set_lcm_register(0xD40D,0xAD); +set_lcm_register(0xD40E,0x00); +set_lcm_register(0xD40F,0xDE); +set_lcm_register(0xD410,0x01); +set_lcm_register(0xD411,0x00); +set_lcm_register(0xD412,0x01); +set_lcm_register(0xD413,0x26); +set_lcm_register(0xD414,0x01); +set_lcm_register(0xD415,0x50); +set_lcm_register(0xD416,0x01); +set_lcm_register(0xD417,0x87); +set_lcm_register(0xD418,0x01); +set_lcm_register(0xD419,0xB3); +set_lcm_register(0xD41A,0x01); +set_lcm_register(0xD41B,0xB6); +set_lcm_register(0xD41C,0x01); +set_lcm_register(0xD41D,0xDC); +set_lcm_register(0xD41E,0x02); +set_lcm_register(0xD41F,0x04); +set_lcm_register(0xD420,0x02); +set_lcm_register(0xD421,0x1C); +set_lcm_register(0xD422,0x02); +set_lcm_register(0xD423,0x34); +set_lcm_register(0xD424,0x02); +set_lcm_register(0xD425,0x4E); +set_lcm_register(0xD426,0x02); +set_lcm_register(0xD427,0x8A); +set_lcm_register(0xD428,0x02); +set_lcm_register(0xD429,0xC2); +set_lcm_register(0xD42A,0x03); +set_lcm_register(0xD42B,0x04); +set_lcm_register(0xD42C,0x03); +set_lcm_register(0xD42D,0x2E); +set_lcm_register(0xD42E,0x03); +set_lcm_register(0xD42F,0x74); +set_lcm_register(0xD430,0x03); +set_lcm_register(0xD431,0xEB); +set_lcm_register(0xD432,0x03); +set_lcm_register(0xD433,0xFF); + + +//GAMMA SETING RED +set_lcm_register(0xD500,0x00); +set_lcm_register(0xD501,0x00); +set_lcm_register(0xD502,0x00); +set_lcm_register(0xD503,0x16); +set_lcm_register(0xD504,0x00); +set_lcm_register(0xD505,0x42); +set_lcm_register(0xD506,0x00); +set_lcm_register(0xD507,0x61); +set_lcm_register(0xD508,0x00); +set_lcm_register(0xD509,0x74); +set_lcm_register(0xD50A,0x00); +set_lcm_register(0xD50B,0x97); +set_lcm_register(0xD50C,0x00); +set_lcm_register(0xD50D,0xAD); +set_lcm_register(0xD50E,0x00); +set_lcm_register(0xD50F,0xDE); +set_lcm_register(0xD510,0x01); +set_lcm_register(0xD511,0x00); +set_lcm_register(0xD512,0x01); +set_lcm_register(0xD513,0x26); +set_lcm_register(0xD514,0x01); +set_lcm_register(0xD515,0x50); +set_lcm_register(0xD516,0x01); +set_lcm_register(0xD517,0x87); +set_lcm_register(0xD518,0x01); +set_lcm_register(0xD519,0xB3); +set_lcm_register(0xD51A,0x01); +set_lcm_register(0xD51B,0xB6); +set_lcm_register(0xD51C,0x01); +set_lcm_register(0xD51D,0xDC); +set_lcm_register(0xD51E,0x02); +set_lcm_register(0xD51F,0x04); +set_lcm_register(0xD520,0x02); +set_lcm_register(0xD521,0x1C); +set_lcm_register(0xD522,0x02); +set_lcm_register(0xD523,0x34); +set_lcm_register(0xD524,0x02); +set_lcm_register(0xD525,0x4E); +set_lcm_register(0xD526,0x02); +set_lcm_register(0xD527,0x8A); +set_lcm_register(0xD528,0x02); +set_lcm_register(0xD529,0xC2); +set_lcm_register(0xD52A,0x03); +set_lcm_register(0xD52B,0x04); +set_lcm_register(0xD52C,0x03); +set_lcm_register(0xD52D,0x2E); +set_lcm_register(0xD52E,0x03); +set_lcm_register(0xD52F,0x74); +set_lcm_register(0xD530,0x03); +set_lcm_register(0xD531,0xEB); +set_lcm_register(0xD532,0x03); +set_lcm_register(0xD533,0xFF); + + + +//GAMMA SETING RED +set_lcm_register(0xD600,0x00); +set_lcm_register(0xD601,0x00); +set_lcm_register(0xD602,0x00); +set_lcm_register(0xD603,0x16); +set_lcm_register(0xD604,0x00); +set_lcm_register(0xD605,0x42); +set_lcm_register(0xD606,0x00); +set_lcm_register(0xD607,0x61); +set_lcm_register(0xD608,0x00); +set_lcm_register(0xD609,0x74); +set_lcm_register(0xD60A,0x00); +set_lcm_register(0xD60B,0x97); +set_lcm_register(0xD60C,0x00); +set_lcm_register(0xD60D,0xAD); +set_lcm_register(0xD60E,0x00); +set_lcm_register(0xD60F,0xDE); +set_lcm_register(0xD610,0x01); +set_lcm_register(0xD611,0x00); +set_lcm_register(0xD612,0x01); +set_lcm_register(0xD613,0x26); +set_lcm_register(0xD614,0x01); +set_lcm_register(0xD615,0x50); +set_lcm_register(0xD616,0x01); +set_lcm_register(0xD617,0x87); +set_lcm_register(0xD618,0x01); +set_lcm_register(0xD619,0xB3); +set_lcm_register(0xD61A,0x01); +set_lcm_register(0xD61B,0xB6); +set_lcm_register(0xD61C,0x01); +set_lcm_register(0xD61D,0xDC); +set_lcm_register(0xD61E,0x02); +set_lcm_register(0xD61F,0x04); +set_lcm_register(0xD620,0x02); +set_lcm_register(0xD621,0x1C); +set_lcm_register(0xD622,0x02); +set_lcm_register(0xD623,0x34); +set_lcm_register(0xD624,0x02); +set_lcm_register(0xD625,0x4E); +set_lcm_register(0xD626,0x02); +set_lcm_register(0xD627,0x8A); +set_lcm_register(0xD628,0x02); +set_lcm_register(0xD629,0xC2); +set_lcm_register(0xD62A,0x03); +set_lcm_register(0xD62B,0x04); +set_lcm_register(0xD62C,0x03); +set_lcm_register(0xD62D,0x2E); +set_lcm_register(0xD62E,0x03); +set_lcm_register(0xD62F,0x74); +set_lcm_register(0xD630,0x03); +set_lcm_register(0xD631,0xEB); +set_lcm_register(0xD632,0x03); +set_lcm_register(0xD633,0xFF); + +set_lcm_register(0x3A00,0x77); +MDELAY(10); +send_ctrl_cmd(0x1100); +MDELAY(150); +send_ctrl_cmd(0x2900); +MDELAY(100); +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + //lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0);//input + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, 0); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(150); + send_ctrl_cmd(0x2900); + MDELAY(100); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); + + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_read_data(); //spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_read_data(); //spi_read_data(); + + id = (id1<<8)|id2; + + + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER p2498_wvga_nt35510_lcm_drv = +{ + + .name = "p2498_wvga_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/qtb4d0058_wvga_nt35510/qtb4d0058_wvga_nt35510.c b/acer_e350_simcom75/lcm/qtb4d0058_wvga_nt35510/qtb4d0058_wvga_nt35510.c new file mode 100644 index 0000000..08e6695 --- /dev/null +++ b/acer_e350_simcom75/lcm/qtb4d0058_wvga_nt35510/qtb4d0058_wvga_nt35510.c @@ -0,0 +1,700 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +//#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x0100); + MDELAY(10); + //enable page 1 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + //VCOM setting + set_lcm_register(0xBC00,0x00); + set_lcm_register(0xBC01,0xC8); + set_lcm_register(0xBC02,0x38); + set_lcm_register(0xBD00,0x00); + set_lcm_register(0xBD01,0xC8); + set_lcm_register(0xBD02,0x38); + + set_lcm_register(0xBE00,0x00); //Vcom voltage offset mode + set_lcm_register(0xBE01,0x6F); // DC VCOM + +//gama setting Red + + set_lcm_register(0xD100,0x00); + set_lcm_register(0xD101,0x3f); + set_lcm_register(0xD102,0x00); + set_lcm_register(0xD103,0x5d); + set_lcm_register(0xD104,0x00); + set_lcm_register(0xD105,0x98); + set_lcm_register(0xD106,0x00); + set_lcm_register(0xD107,0xC0); + set_lcm_register(0xD108,0x00); + set_lcm_register(0xD109,0xde); + set_lcm_register(0xD10A,0x01); + set_lcm_register(0xD10B,0x0B); + set_lcm_register(0xD10C,0x01); + set_lcm_register(0xD10D,0x2E); + set_lcm_register(0xD10E,0x01); + set_lcm_register(0xD10F,0x63); + set_lcm_register(0xD110,0x01); + set_lcm_register(0xD111,0x8A); + set_lcm_register(0xD112,0x01); + set_lcm_register(0xD113,0xC2); + set_lcm_register(0xD114,0x01); + set_lcm_register(0xD115,0xEC); + set_lcm_register(0xD116,0x02); + set_lcm_register(0xD117,0x2C); + set_lcm_register(0xD118,0x02); + set_lcm_register(0xD119,0x5C); + set_lcm_register(0xD11A,0x02); + set_lcm_register(0xD11B,0x5E); + set_lcm_register(0xD11C,0x02); + set_lcm_register(0xD11D,0x88); + set_lcm_register(0xD11E,0x02); + set_lcm_register(0xD11F,0xB1); + set_lcm_register(0xD120,0x02); + set_lcm_register(0xD121,0xC9); + set_lcm_register(0xD122,0x02); + set_lcm_register(0xD123,0xE8); + set_lcm_register(0xD124,0x03); + set_lcm_register(0xD125,0x00); + set_lcm_register(0xD126,0x03); + set_lcm_register(0xD127,0x2C); + set_lcm_register(0xD128,0x03); + set_lcm_register(0xD129,0x51); + set_lcm_register(0xD12A,0x03); + set_lcm_register(0xD12B,0x86); + set_lcm_register(0xD12C,0x03); + set_lcm_register(0xD12D,0xA8); + set_lcm_register(0xD12E,0x03); + set_lcm_register(0xD12F,0xCA); + set_lcm_register(0xD130,0x03); + set_lcm_register(0xD131,0xE7); + set_lcm_register(0xD132,0x03); + set_lcm_register(0xD133,0xF3); +//GAMMA SETTING GREEN + set_lcm_register(0xD200,0x00); + set_lcm_register(0xD201,0x3F); + set_lcm_register(0xD202,0x00); + set_lcm_register(0xD203,0x5D); + set_lcm_register(0xD204,0x00); + set_lcm_register(0xD205,0x98); + set_lcm_register(0xD206,0x00); + set_lcm_register(0xD207,0xC0); + set_lcm_register(0xD208,0x00); + set_lcm_register(0xD209,0xDE); + set_lcm_register(0xD20A,0x01); + set_lcm_register(0xD20B,0x0B); + set_lcm_register(0xD20C,0x01); + set_lcm_register(0xD20D,0x2E); + set_lcm_register(0xD20E,0x01); + set_lcm_register(0xD20F,0x63); + set_lcm_register(0xD210,0x01); + set_lcm_register(0xD211,0x8A); + set_lcm_register(0xD212,0x01); + set_lcm_register(0xD213,0xC2); + set_lcm_register(0xD214,0x01); + set_lcm_register(0xD215,0xEC); + set_lcm_register(0xD216,0x02); + set_lcm_register(0xD217,0x2C); + set_lcm_register(0xD218,0x02); + set_lcm_register(0xD219,0x5C); + set_lcm_register(0xD21A,0x02); + set_lcm_register(0xD21B,0x5E); + set_lcm_register(0xD21C,0x02); + set_lcm_register(0xD21D,0x88); + set_lcm_register(0xD21E,0x02); + set_lcm_register(0xD21F,0xB1); + set_lcm_register(0xD220,0x02); + set_lcm_register(0xD221,0xC9); + set_lcm_register(0xD222,0x02); + set_lcm_register(0xD223,0xE8); + set_lcm_register(0xD224,0x03); + set_lcm_register(0xD225,0x00); + set_lcm_register(0xD226,0x03); + set_lcm_register(0xD227,0x2C); + set_lcm_register(0xD228,0x03); + set_lcm_register(0xD229,0x51); + set_lcm_register(0xD22A,0x03); + set_lcm_register(0xD22B,0x86); + set_lcm_register(0xD22C,0x03); + set_lcm_register(0xD22D,0xA8); + set_lcm_register(0xD22E,0x03); + set_lcm_register(0xD22F,0xCA); + set_lcm_register(0xD230,0x03); + set_lcm_register(0xD231,0xE7); + set_lcm_register(0xD232,0x03); + set_lcm_register(0xD233,0xF3); +//GAMMA SETTING BLUE + set_lcm_register(0xD300,0x00); + set_lcm_register(0xD301,0x3F); + set_lcm_register(0xD302,0x00); + set_lcm_register(0xD303,0x5D); + set_lcm_register(0xD304,0x00); + set_lcm_register(0xD305,0x98); + set_lcm_register(0xD306,0x00); + set_lcm_register(0xD307,0xC0); + set_lcm_register(0xD308,0x00); + set_lcm_register(0xD309,0xDE); + set_lcm_register(0xD30A,0x01); + set_lcm_register(0xD30B,0x0B); + set_lcm_register(0xD30C,0x01); + set_lcm_register(0xD30D,0x2E); + set_lcm_register(0xD30E,0x01); + set_lcm_register(0xD30F,0x63); + set_lcm_register(0xD310,0x01); + set_lcm_register(0xD311,0x8A); + set_lcm_register(0xD312,0x01); + set_lcm_register(0xD313,0xC2); + set_lcm_register(0xD314,0x01); + set_lcm_register(0xD315,0xEC); + set_lcm_register(0xD316,0x02); + set_lcm_register(0xD317,0x2C); + set_lcm_register(0xD318,0x02); + set_lcm_register(0xD319,0x5C); + set_lcm_register(0xD31A,0x02); + set_lcm_register(0xD31B,0x5E); + set_lcm_register(0xD31C,0x02); + set_lcm_register(0xD31D,0x88); + set_lcm_register(0xD31E,0x02); + set_lcm_register(0xD31F,0xB1); + set_lcm_register(0xD320,0x02); + set_lcm_register(0xD321,0xC9); + set_lcm_register(0xD322,0x02); + set_lcm_register(0xD323,0xE8); + set_lcm_register(0xD324,0x03); + set_lcm_register(0xD325,0x00); + set_lcm_register(0xD326,0x03); + set_lcm_register(0xD327,0x2C); + set_lcm_register(0xD328,0x03); + set_lcm_register(0xD329,0x51); + set_lcm_register(0xD32A,0x03); + set_lcm_register(0xD32B,0x86); + set_lcm_register(0xD32C,0x03); + set_lcm_register(0xD32D,0xA8); + set_lcm_register(0xD32E,0x03); + set_lcm_register(0xD32F,0xCA); + set_lcm_register(0xD330,0x03); + set_lcm_register(0xD331,0xE7); + set_lcm_register(0xD332,0x03); + set_lcm_register(0xD333,0xF3); + +//GAMMA SETTING RED + set_lcm_register(0xD400,0x00); + set_lcm_register(0xD401,0x3F); + set_lcm_register(0xD402,0x00); + set_lcm_register(0xD403,0x5D); + set_lcm_register(0xD404,0x00); + set_lcm_register(0xD405,0x98); + set_lcm_register(0xD406,0x00); + set_lcm_register(0xD407,0xC0); + set_lcm_register(0xD408,0x00); + set_lcm_register(0xD409,0xDE); + set_lcm_register(0xD40A,0x01); + set_lcm_register(0xD40B,0x0B); + set_lcm_register(0xD40C,0x01); + set_lcm_register(0xD40D,0x2E); + set_lcm_register(0xD40E,0x01); + set_lcm_register(0xD40F,0x63); + set_lcm_register(0xD410,0x01); + set_lcm_register(0xD411,0x8A); + set_lcm_register(0xD412,0x01); + set_lcm_register(0xD413,0xC2); + set_lcm_register(0xD414,0x01); + set_lcm_register(0xD415,0xEC); + set_lcm_register(0xD416,0x02); + set_lcm_register(0xD417,0x2C); + set_lcm_register(0xD418,0x02); + set_lcm_register(0xD419,0x5C); + set_lcm_register(0xD41A,0x02); + set_lcm_register(0xD41B,0x5E); + set_lcm_register(0xD41C,0x02); + set_lcm_register(0xD41D,0x88); + set_lcm_register(0xD41E,0x02); + set_lcm_register(0xD41F,0xB1); + set_lcm_register(0xD420,0x02); + set_lcm_register(0xD421,0xC9); + set_lcm_register(0xD422,0x02); + set_lcm_register(0xD423,0xE8); + set_lcm_register(0xD424,0x03); + set_lcm_register(0xD425,0x00); + set_lcm_register(0xD426,0x03); + set_lcm_register(0xD427,0x2C); + set_lcm_register(0xD428,0x03); + set_lcm_register(0xD429,0x51); + set_lcm_register(0xD42A,0x03); + set_lcm_register(0xD42B,0x86); + set_lcm_register(0xD42C,0x03); + set_lcm_register(0xD42D,0xA8); + set_lcm_register(0xD42E,0x03); + set_lcm_register(0xD42F,0xCA); + set_lcm_register(0xD430,0x03); + set_lcm_register(0xD431,0xE7); + set_lcm_register(0xD432,0x03); + set_lcm_register(0xD433,0xF3); + +//GAMMA SETTING GREEN + set_lcm_register(0xD500,0x00); + set_lcm_register(0xD501,0x3F); + set_lcm_register(0xD502,0x00); + set_lcm_register(0xD503,0x5D); + set_lcm_register(0xD504,0x00); + set_lcm_register(0xD505,0x98); + set_lcm_register(0xD506,0x00); + set_lcm_register(0xD507,0xC0); + set_lcm_register(0xD508,0x00); + set_lcm_register(0xD509,0xDE); + set_lcm_register(0xD50A,0x01); + set_lcm_register(0xD50B,0x0B); + set_lcm_register(0xD50C,0x01); + set_lcm_register(0xD50D,0x2E); + set_lcm_register(0xD50E,0x01); + set_lcm_register(0xD50F,0x63); + set_lcm_register(0xD510,0x01); + set_lcm_register(0xD511,0x8A); + set_lcm_register(0xD512,0x01); + set_lcm_register(0xD513,0xC2); + set_lcm_register(0xD514,0x01); + set_lcm_register(0xD515,0xEC); + set_lcm_register(0xD516,0x02); + set_lcm_register(0xD517,0x2C); + set_lcm_register(0xD518,0x02); + set_lcm_register(0xD519,0x5C); + set_lcm_register(0xD51A,0x02); + set_lcm_register(0xD51B,0x5E); + set_lcm_register(0xD51C,0x02); + set_lcm_register(0xD51D,0x88); + set_lcm_register(0xD51E,0x02); + set_lcm_register(0xD51F,0xB1); + set_lcm_register(0xD520,0x02); + set_lcm_register(0xD521,0xC9); + set_lcm_register(0xD522,0x02); + set_lcm_register(0xD523,0xE8); + set_lcm_register(0xD524,0x03); + set_lcm_register(0xD525,0x00); + set_lcm_register(0xD526,0x03); + set_lcm_register(0xD527,0x2C); + set_lcm_register(0xD528,0x03); + set_lcm_register(0xD529,0x51); + set_lcm_register(0xD52A,0x03); + set_lcm_register(0xD52B,0x86); + set_lcm_register(0xD52C,0x03); + set_lcm_register(0xD52D,0xA8); + set_lcm_register(0xD52E,0x03); + set_lcm_register(0xD52F,0xCA); + set_lcm_register(0xD530,0x03); + set_lcm_register(0xD531,0xE7); + set_lcm_register(0xD532,0x03); + set_lcm_register(0xD533,0xF3); + +//GAMMA SETTING BLUE + set_lcm_register(0xD600,0x00); + set_lcm_register(0xD601,0x3F); + set_lcm_register(0xD602,0x00); + set_lcm_register(0xD603,0x5D); + set_lcm_register(0xD604,0x00); + set_lcm_register(0xD605,0x98); + set_lcm_register(0xD606,0x00); + set_lcm_register(0xD607,0xC0); + set_lcm_register(0xD608,0x00); + set_lcm_register(0xD609,0xDE); + set_lcm_register(0xD60A,0x01); + set_lcm_register(0xD60B,0x0B); + set_lcm_register(0xD60C,0x01); + set_lcm_register(0xD60D,0x2E); + set_lcm_register(0xD60E,0x01); + set_lcm_register(0xD60F,0x63); + set_lcm_register(0xD610,0x01); + set_lcm_register(0xD611,0x8A); + set_lcm_register(0xD612,0x01); + set_lcm_register(0xD613,0xC2); + set_lcm_register(0xD614,0x01); + set_lcm_register(0xD615,0xEC); + set_lcm_register(0xD616,0x02); + set_lcm_register(0xD617,0x2C); + set_lcm_register(0xD618,0x02); + set_lcm_register(0xD619,0x5C); + set_lcm_register(0xD61A,0x02); + set_lcm_register(0xD61B,0x5E); + set_lcm_register(0xD61C,0x02); + set_lcm_register(0xD61D,0x88); + set_lcm_register(0xD61E,0x02); + set_lcm_register(0xD61F,0xB1); + set_lcm_register(0xD620,0x02); + set_lcm_register(0xD621,0xC9); + set_lcm_register(0xD622,0x02); + set_lcm_register(0xD623,0xE8); + set_lcm_register(0xD624,0x03); + set_lcm_register(0xD625,0x00); + set_lcm_register(0xD626,0x03); + set_lcm_register(0xD627,0x2C); + set_lcm_register(0xD628,0x03); + set_lcm_register(0xD629,0x51); + set_lcm_register(0xD62A,0x03); + set_lcm_register(0xD62B,0x86); + set_lcm_register(0xD62C,0x03); + set_lcm_register(0xD62D,0xA8); + set_lcm_register(0xD62E,0x03); + set_lcm_register(0xD62F,0xCA); + set_lcm_register(0xD630,0x03); + set_lcm_register(0xD631,0xE7); + set_lcm_register(0xD632,0x03); + set_lcm_register(0xD633,0xF3); + +//AVDD Voltage Setting + set_lcm_register(0xB000,0x00); + set_lcm_register(0xB001,0x00); + set_lcm_register(0xB002,0x00); +//AVEE Voltage Setting + set_lcm_register(0xB100,0x00); + set_lcm_register(0xB101,0x00); + set_lcm_register(0xB102,0x00); +//VGLX Voltage Setting + set_lcm_register(0xBA00,0x14); + set_lcm_register(0xBA01,0x14); + set_lcm_register(0xBA02,0x14); +//VGH Voltage Setting + set_lcm_register(0xB900,0x24); + set_lcm_register(0xB901,0x24); + set_lcm_register(0xB902,0x24); +//Enable Page 0 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x00); +//RAM Keep + set_lcm_register(0xB100,0xCC); +//Z-Inversion + set_lcm_register(0xBC00,0x05); + set_lcm_register(0xBC01,0x05); + set_lcm_register(0xBC02,0x05); +//Source EQ + set_lcm_register(0xB800,0x01); +//Porch Lines + set_lcm_register(0xBD02,0x07); + set_lcm_register(0xBD03,0x31); + set_lcm_register(0xBE02,0x07); + set_lcm_register(0xBE03,0x31); + set_lcm_register(0xBF02,0x07); + set_lcm_register(0xBF03,0x31); + + set_lcm_register(0xFF00,0xAA); + set_lcm_register(0xFF01,0x55); + set_lcm_register(0XFF02,0x25); + set_lcm_register(0xFF03,0x01); + + set_lcm_register(0xF304,0x11); + set_lcm_register(0xF306,0x10); + set_lcm_register(0xF408,0x00); + + set_lcm_register(0x3500,0x00); + set_lcm_register(0x3a00,0x77); //77:888;66:666;55:565 + + send_ctrl_cmd(0x1100); + MDELAY(120); + + send_ctrl_cmd(0x2900); + MDELAY(10); +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + //lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + //lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; //LCM_POLARITY_FALLING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + +#if 1 + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; +#else + params->dpi.hsync_pulse_width = 12; + params->dpi.hsync_back_porch = 8; + params->dpi.hsync_front_porch = 8; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 8; + params->dpi.vsync_front_porch = 8; +#endif + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(150); + send_ctrl_cmd(0x2900); + MDELAY(100); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER qtb4d0058_wvga_nt35510_lcm_drv = +{ + + .name = "qtb4d0058_wvga_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/acer_e350_simcom75/lcm/r61408/r61408.c b/acer_e350_simcom75/lcm/r61408/r61408.c new file mode 100644 index 0000000..083b54f --- /dev/null +++ b/acer_e350_simcom75/lcm/r61408/r61408.c @@ -0,0 +1,369 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x1408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +#if defined(LCM_DSI_CMD_MODE) + data_array[0] = 0x04B02300;//B0 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + data_array[0] = 0x00032902;//MIPI DSI Control + data_array[1] = 0x008352B6; //B6 + dsi_set_cmdq(&data_array, 2, 1); + + data_array[0] = 0x00152902;//BLC + data_array[1] = 0x090900B8; //B8 + data_array[2] = 0xe6e6ffff; + data_array[3] = 0x10101802; + data_array[4] = 0xbe875a37; + data_array[5] = 0x000000ff; + data_array[6] = 0x00000000; + dsi_set_cmdq(&data_array, 7, 1); + MDELAY(50); + + data_array[0] = 0x00052902; + data_array[1] = 0x02ff00B9; //B9 + data_array[2] = 0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + + data_array[0] = 0x00102902; // panel driving setting 2 + data_array[1] = 0x003143C1; //C1 + data_array[2] = 0x12322626; + data_array[3] = 0xA50a4a28; + data_array[4] = 0x0121580F; + dsi_set_cmdq(&data_array, 5, 1); + + data_array[0] = 0x28d62300;//D6 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00053902; + data_array[1] = 0x0100002A;//2A + data_array[2] = 0x000000DF; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(50); + + data_array[0] = 0x00053902; + data_array[1] = 0x0300002B;//2B + data_array[2] = 0x0000001f; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(50); + + data_array[0] = 0x00361500;//36 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x00351500;//36 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x773A1500;//3A + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x00110500;//11 + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(125); + + data_array[0] = 0x00290500;//29 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(125); +#endif +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + +static void lcm_init(void) +{ + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ZERO); + MDELAY(25); + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ONE); + MDELAY(50); + + init_lcm_registers(); + MDELAY(500); +// clear_panel(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; +// data_array[6]= 0x002c3901; + + dsi_set_cmdq(data_array, 7, 0); + +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + data_array[0] = 0x00052902; + data_array[1] = 0x020000B9 | (level << 16); //B9 + data_array[2] = 0x00000008; + dsi_set_cmdq(data_array, 3, 1); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[5]; + unsigned int array[16]; + //NOTE:should reset LCM firstly + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ZERO); + MDELAY(25); + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ONE); + MDELAY(50); + + array[0] = 0x00053700;// read id return 5 byte + dsi_set_cmdq(array, 1, 1); + + array[0] = 0x04B02300;// unlock for reading ID + dsi_set_cmdq(array, 1, 1); + MDELAY(50); + + read_reg_v2(0xBF, buffer, 5); + id = (buffer[2] << 8) | buffer[3]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%x\n", __func__, id); +#endif + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER r61408_lcm_drv = +{ + .name = "r61408", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id +}; + diff --git a/acer_e350_simcom75/lcm/s6d0170/s6d0170.c b/acer_e350_simcom75/lcm/s6d0170/s6d0170.c new file mode 100644 index 0000000..7dd9dce --- /dev/null +++ b/acer_e350_simcom75/lcm/s6d0170/s6d0170.c @@ -0,0 +1,372 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/spfd5461a/spfd5461a.c b/acer_e350_simcom75/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..8b77cff --- /dev/null +++ b/acer_e350_simcom75/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,420 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/sr4009gg_wvga_lg4573/sr4009gg_wvga_lg4573.c b/acer_e350_simcom75/lcm/sr4009gg_wvga_lg4573/sr4009gg_wvga_lg4573.c new file mode 100644 index 0000000..6123a69 --- /dev/null +++ b/acer_e350_simcom75/lcm/sr4009gg_wvga_lg4573/sr4009gg_wvga_lg4573.c @@ -0,0 +1,678 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +#ifndef BUILD_UBOOT +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +//chenhaojun +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x4573 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; +volatile unsigned char lg4573_id_buf[8]; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_read_data(unsigned char data[]) +{ + unsigned int i; + int k; + //unsigned int data1 = ((0x70 << 8) | (reg & 0xFF)); + unsigned int data2= 0x73; + + unsigned char getbyte1=0; + unsigned char getbyte2=0; + unsigned char getbyte3=0; + unsigned char getbyte4=0; + unsigned char getbyte5=0; + unsigned char getbyte6=0; + unsigned char getbyte7=0; + unsigned char getbyte8=0; +#if 1 + data[0]=0; + data[1]=0; + data[2]=0; + data[3]=0; + data[4]=0; + data[5]=0; + data[6]=0; + data[7]=0; +#endif + //reg = (CTRL_ID | (reg & 0xFF)); + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + SET_LA0_INPUT; + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data2 & (1 << 7)) + { + SET_LSDA_HIGH; + } + else + { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data2 <<= 1; + } + + + UDELAY(5); + for(i=0;i<8;++i) + { + SET_LSCK_LOW; + UDELAY(5); + SET_LSCK_HIGH; + UDELAY(5); + } + + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + + if (GET_LSA0_BIT) { + getbyte1 |= (1 << k); + } + + SET_LSCK_HIGH; + UDELAY(5); + + } + + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte2 |= (1 << k); + } + + SET_LSCK_HIGH; + UDELAY(5); + + } + + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + + if (GET_LSA0_BIT) { + getbyte3 |= (1 << k); + } + + SET_LSCK_HIGH; + UDELAY(5); + + } + + for (k = 7; k >= 0; k--) + { + + SET_LSCK_LOW; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte4 |= (1 << k); + } + + SET_LSCK_HIGH; + UDELAY(5); + } + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte5 |= (1 << k); + } + + SET_LSCK_HIGH; + UDELAY(5); + + } + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte6 |= (1 << k); + } + + SET_LSCK_HIGH; + UDELAY(5); + + } + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + if (GET_LSA0_BIT) + { + getbyte7 |= (1 << k); + } + + SET_LSCK_HIGH; + UDELAY(5); + } + for (k = 7; k >= 0; k--) + { + + SET_LSCK_LOW; + UDELAY(5); + if (GET_LSA0_BIT) + { + getbyte8 |= (1 << k); + } + + SET_LSCK_HIGH; + UDELAY(5); + } + UDELAY(2); + + //SET_LSDA_OUTPUT; + + SET_LSDA_HIGH; + SET_LSCE_HIGH; + + data[0]=getbyte1; + data[1]=getbyte2; + data[2]=getbyte3; + data[3]=getbyte4; + data[4]=getbyte5; + data[5]=getbyte6; + data[6]=getbyte7; + data[7]=getbyte8; + +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = ((0x70 << 8) | (cmd & 0xFF)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = ((0x72 << 8) | (data & 0xFF)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + +#ifdef BUILD_UBOOT + printf("init_lcm_registers\r\n"); +#else + printk("init_lcm_registers\r\n"); +#endif + + send_ctrl_cmd(0xC0); + send_data_cmd(0x01); + send_data_cmd(0x18); + + send_ctrl_cmd(0x20); + send_ctrl_cmd(0x29); + send_ctrl_cmd(0x36); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x77); + + send_ctrl_cmd(0xB1); + send_data_cmd(0x86); + send_data_cmd(0x1E); + send_data_cmd(0x0C); + + send_ctrl_cmd(0xB2); + send_data_cmd(0x00); + send_data_cmd(0xC8); // V resolution + + send_ctrl_cmd(0xB3); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB4); + send_data_cmd(0x04); + + send_ctrl_cmd(0xB5); + send_data_cmd(0x10); + send_data_cmd(0x30); + send_data_cmd(0x30); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB6); + send_data_cmd(0x0B); + send_data_cmd(0x0F); + send_data_cmd(0x3C); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xe8); + + send_ctrl_cmd(0xB7); + send_data_cmd(0x46); + send_data_cmd(0x06); + send_data_cmd(0x0C); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xC3); + send_data_cmd(0x07); + send_data_cmd(0x03); + send_data_cmd(0x04); + send_data_cmd(0x04); + send_data_cmd(0x04); + + send_ctrl_cmd(0xC4); + send_data_cmd(0x11); + send_data_cmd(0x23); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x01); + send_data_cmd(0x6D); + + send_ctrl_cmd(0xC5); + send_data_cmd(0x70);// 0x66 + + send_ctrl_cmd(0xC6); + send_data_cmd(0x24); + send_data_cmd(0x63); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); + send_data_cmd(0x20); + send_data_cmd(0x40); + send_data_cmd(0x44); + send_data_cmd(0x25); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x61); + send_data_cmd(0x16); + send_data_cmd(0x02); + + send_ctrl_cmd(0xD1); + send_data_cmd(0x20); + send_data_cmd(0x40); + send_data_cmd(0x44); + send_data_cmd(0x25); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x61); + send_data_cmd(0x16); + send_data_cmd(0x02); + + send_ctrl_cmd(0xD2); + send_data_cmd(0x20); + send_data_cmd(0x40); + send_data_cmd(0x44); + send_data_cmd(0x25); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x61); + send_data_cmd(0x16); + send_data_cmd(0x02); + + send_ctrl_cmd(0xD3); + send_data_cmd(0x20); + send_data_cmd(0x40); + send_data_cmd(0x44); + send_data_cmd(0x25); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x61); + send_data_cmd(0x16); + send_data_cmd(0x02); + + send_ctrl_cmd(0xD4); + send_data_cmd(0x20); + send_data_cmd(0x40); + send_data_cmd(0x44); + send_data_cmd(0x25); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x61); + send_data_cmd(0x16); + send_data_cmd(0x02); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x20); + send_data_cmd(0x40); + send_data_cmd(0x44); + send_data_cmd(0x25); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x61); + send_data_cmd(0x16); + send_data_cmd(0x02); + + send_ctrl_cmd(0x29); + send_ctrl_cmd(0x11); + MDELAY(100); +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 12; + params->dpi.hsync_back_porch = 8; + params->dpi.hsync_front_porch = 8; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 8; + params->dpi.vsync_front_porch = 8; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + +#ifdef BUILD_UBOOT + printf("lcm_init\r\n"); +#else + printk("lcm_init\r\n"); +#endif + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(50); +} + + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(50); +#if 0//ndef BUILD_UBOOT + printk("APHW_CODE = 0x%x\n",get_chip_code()); + printk("APHW_VER = 0x%x\n",get_chip_eco_ver()); + printk("APSW_VER = 0x%x\n",get_chip_sw_ver()); + printk("APHW_SUBCODE = 0x%x\n",get_chip_subcode()); +#endif +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id=0; + #if 1 + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + #endif + send_ctrl_cmd(0xa1); + spi_read_data(lg4573_id_buf); + id = ((lg4573_id_buf[6] << 8) | lg4573_id_buf[7]); +#ifdef BUILD_UBOOT + printf("lg4573_id1=0x%x,lg4573_id2=0x%x,lg4573_id3=0x%x,lg4573_id4=0x%x,lg4573_id5=0x%x,lg4573_id6=0x%x,lg4573_id7=0x%x,lg4573_id8=0x%x\r\n", + lg4573_id_buf[0],lg4573_id_buf[1],lg4573_id_buf[2],lg4573_id_buf[3],lg4573_id_buf[4],lg4573_id_buf[5],lg4573_id_buf[6],lg4573_id_buf[7]); + printf("lg4573_id=0x%x\r\n",id); +#else + printk("lg4573_id1=0x%x,lg4573_id2=0x%x,lg4573_id3=0x%x,lg4573_id4=0x%x,lg4573_id5=0x%x,lg4573_id6=0x%x,lg4573_id7=0x%x,lg4573_id8=0x%x\r\n", + lg4573_id_buf[0],lg4573_id_buf[1],lg4573_id_buf[2],lg4573_id_buf[3],lg4573_id_buf[4],lg4573_id_buf[5],lg4573_id_buf[6],lg4573_id_buf[7]); + printk("lg4573_id=0x%x\r\n",id); +#endif + + + return (LCM_ID == id)?1:0; + +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER sr4009gg_lg4573_lcm_drv = +{ + .name = "sr4009gg_lg4573", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; + + + diff --git a/acer_e350_simcom75/lcm/sr4009tn_wvga_nt35510/sr4009tn_wvga_nt35510.c b/acer_e350_simcom75/lcm/sr4009tn_wvga_nt35510/sr4009tn_wvga_nt35510.c new file mode 100755 index 0000000..93c8d6e --- /dev/null +++ b/acer_e350_simcom75/lcm/sr4009tn_wvga_nt35510/sr4009tn_wvga_nt35510.c @@ -0,0 +1,1445 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +#include "cust_adc.h"//LK@add + +#ifndef BUILD_UBOOT +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +//chenhaojun +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x5510 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_read_data(void) +{ + unsigned int i; + int k=0; + unsigned int getbyte1=0; + unsigned int data=0; + +#ifdef BUILD_UBOOT + printf("spi_read_data \r\n"); +#endif + + data = 0xc0; + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + SET_LA0_INPUT; + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 7)) + { + SET_LSDA_HIGH; + } + else + { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } +#if 0 + for(i=8;i>0;i--) + { + SET_LSCK_LOW; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#endif + UDELAY(5); + for (k = 7; k >=0; k--) + { + SET_LSCK_LOW; + if (GET_LSA0_BIT) + { + getbyte1 |= (1 << k); + } + + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#ifdef BUILD_UBOOT + printf("getbyte1=0x%x \r\n",getbyte1); +#endif + SET_LSDA_HIGH; + SET_LSCE_HIGH; + return getbyte1; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + + +static void init_lcm_registers(void) +{ +#ifdef BUILD_UBOOT + printf("init_lcm_registers\r\n"); +#else + printk("init_lcm_registers\r\n"); +#endif +#if 0//original + //####################### + //#ENABLE CMD2 Page 1 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + //######################## + + //#VGMP/VGMN/VOOM Setting, VGMP=5.6V #VGSP=0.837V + set_lcm_register(0xBC00,0x00); + set_lcm_register(0xBC01,0xE0); + set_lcm_register(0xBC02,0x2B); + + //#VGMN=-5.6V #VGSN=-0.8370V + set_lcm_register(0xBD00,0x00); + set_lcm_register(0xBD01,0xE0); + set_lcm_register(0xBD02,0x2B); + + //#VCOM= + set_lcm_register(0xBE01,0x5D); + + //# R+ + set_lcm_register(0xD100,0x00); + set_lcm_register(0xD101,0x00); + set_lcm_register(0xD102,0x00); + set_lcm_register(0xD103,0x0D); + set_lcm_register(0xD104,0x00); + set_lcm_register(0xD105,0x10); + set_lcm_register(0xD106,0x00); + set_lcm_register(0xD107,0x1C); + set_lcm_register(0xD108,0x00); + set_lcm_register(0xD109,0x27); + set_lcm_register(0xD10A,0x00); + set_lcm_register(0xD10B,0x4F); + set_lcm_register(0xD10C,0x00); + set_lcm_register(0xD10D,0x80); + set_lcm_register(0xD10E,0x00); + set_lcm_register(0xD10F,0xF1); + set_lcm_register(0xD110,0x01); + set_lcm_register(0xD111,0x65); + set_lcm_register(0xD112,0x02); + set_lcm_register(0xD113,0x31); + set_lcm_register(0xD114,0x02); + set_lcm_register(0xD115,0x71); + set_lcm_register(0xD116,0x02); + set_lcm_register(0xD117,0xAB); + set_lcm_register(0xD118,0x02); + set_lcm_register(0xD119,0xD9); + set_lcm_register(0xD11A,0x02); + set_lcm_register(0xD11B,0xDA); + set_lcm_register(0xD11C,0x03); + set_lcm_register(0xD11D,0x01); + set_lcm_register(0xD11E,0x03); + set_lcm_register(0xD11F,0x28); + set_lcm_register(0xD120,0x03); + set_lcm_register(0xD121,0x3E); + set_lcm_register(0xD122,0x03); + set_lcm_register(0xD123,0x57); + set_lcm_register(0xD124,0x03); + set_lcm_register(0xD125,0x66); + set_lcm_register(0xD126,0x03); + set_lcm_register(0xD127,0x78); + set_lcm_register(0xD128,0x03); + set_lcm_register(0xD129,0x84); + set_lcm_register(0xD12A,0x03); + set_lcm_register(0xD12B,0x95); + set_lcm_register(0xD12C,0x03); + set_lcm_register(0xD12D,0xA2); + set_lcm_register(0xD12E,0x03); + set_lcm_register(0xD12F,0xB3); + set_lcm_register(0xD130,0x03); + set_lcm_register(0xD131,0xD7); + set_lcm_register(0xD132,0x03); + set_lcm_register(0xD133,0xFF); + + + //#G + + set_lcm_register(0xD200,0x00); + set_lcm_register(0xD201,0x00); + set_lcm_register(0xD202,0x00); + set_lcm_register(0xD203,0x0D); + set_lcm_register(0xD204,0x00); + set_lcm_register(0xD205,0x10); + set_lcm_register(0xD206,0x00); + set_lcm_register(0xD207,0x1C); + set_lcm_register(0xD208,0x00); + set_lcm_register(0xD209,0x27); + set_lcm_register(0xD20A,0x00); + set_lcm_register(0xD20B,0x4F); + set_lcm_register(0xD20C,0x00); + set_lcm_register(0xD20D,0x80); + set_lcm_register(0xD20E,0x00); + set_lcm_register(0xD20F,0xF1); + set_lcm_register(0xD210,0x01); + set_lcm_register(0xD211,0x65); + set_lcm_register(0xD212,0x02); + set_lcm_register(0xD213,0x31); + set_lcm_register(0xD214,0x02); + set_lcm_register(0xD215,0x71); + set_lcm_register(0xD216,0x02); + set_lcm_register(0xD217,0xAB); + set_lcm_register(0xD218,0x02); + set_lcm_register(0xD219,0xD9); + set_lcm_register(0xD21A,0x02); + set_lcm_register(0xD21B,0xDA); + set_lcm_register(0xD21C,0x03); + set_lcm_register(0xD21D,0x01); + set_lcm_register(0xD21E,0x03); + set_lcm_register(0xD21F,0x28); + set_lcm_register(0xD220,0x03); + set_lcm_register(0xD221,0x3E); + set_lcm_register(0xD222,0x03); + set_lcm_register(0xD223,0x57); + set_lcm_register(0xD224,0x03); + set_lcm_register(0xD225,0x66); + set_lcm_register(0xD226,0x03); + set_lcm_register(0xD227,0x78); + set_lcm_register(0xD228,0x03); + set_lcm_register(0xD229,0x84); + set_lcm_register(0xD22A,0x03); + set_lcm_register(0xD22B,0x95); + set_lcm_register(0xD22C,0x03); + set_lcm_register(0xD22D,0xA2); + set_lcm_register(0xD22E,0x03); + set_lcm_register(0xD22F,0xB3); + set_lcm_register(0xD230,0x03); + set_lcm_register(0xD231,0xD7); + set_lcm_register(0xD232,0x03); + set_lcm_register(0xD233,0xFF); + + //#B + + set_lcm_register(0xD300,0x00); + set_lcm_register(0xD301,0x00); + set_lcm_register(0xD302,0x00); + set_lcm_register(0xD303,0x0D); + set_lcm_register(0xD304,0x00); + set_lcm_register(0xD305,0x10); + set_lcm_register(0xD306,0x00); + set_lcm_register(0xD307,0x1C); + set_lcm_register(0xD308,0x00); + set_lcm_register(0xD309,0x27); + set_lcm_register(0xD30A,0x00); + set_lcm_register(0xD30B,0x4F); + set_lcm_register(0xD30C,0x00); + set_lcm_register(0xD30D,0x80); + set_lcm_register(0xD30E,0x00); + set_lcm_register(0xD30F,0xF1); + set_lcm_register(0xD310,0x01); + set_lcm_register(0xD311,0x65); + set_lcm_register(0xD312,0x02); + set_lcm_register(0xD313,0x31); + set_lcm_register(0xD314,0x02); + set_lcm_register(0xD315,0x71); + set_lcm_register(0xD316,0x02); + set_lcm_register(0xD317,0xAB); + set_lcm_register(0xD318,0x02); + set_lcm_register(0xD319,0xD9); + set_lcm_register(0xD31A,0x02); + set_lcm_register(0xD31B,0xDA); + set_lcm_register(0xD31C,0x03); + set_lcm_register(0xD31D,0x01); + set_lcm_register(0xD31E,0x03); + set_lcm_register(0xD31F,0x28); + set_lcm_register(0xD320,0x03); + set_lcm_register(0xD321,0x3E); + set_lcm_register(0xD322,0x03); + set_lcm_register(0xD323,0x57); + set_lcm_register(0xD324,0x03); + set_lcm_register(0xD325,0x66); + set_lcm_register(0xD326,0x03); + set_lcm_register(0xD327,0x78); + set_lcm_register(0xD328,0x03); + set_lcm_register(0xD329,0x84); + set_lcm_register(0xD32A,0x03); + set_lcm_register(0xD32B,0x95); + set_lcm_register(0xD32C,0x03); + set_lcm_register(0xD32D,0xA2); + set_lcm_register(0xD32E,0x03); + set_lcm_register(0xD32F,0xB3); + set_lcm_register(0xD330,0x03); + set_lcm_register(0xD331,0xD7); + set_lcm_register(0xD332,0x03); + set_lcm_register(0xD333,0xFF); + + //#R - + set_lcm_register(0xD400,0x00); + set_lcm_register(0xD401,0x00); + set_lcm_register(0xD402,0x00); + set_lcm_register(0xD403,0x0D); + set_lcm_register(0xD404,0x00); + set_lcm_register(0xD405,0x10); + set_lcm_register(0xD406,0x00); + set_lcm_register(0xD407,0x1C); + set_lcm_register(0xD408,0x00); + set_lcm_register(0xD409,0x27); + set_lcm_register(0xD40A,0x00); + set_lcm_register(0xD40B,0x4F); + set_lcm_register(0xD40C,0x00); + set_lcm_register(0xD40D,0x80); + set_lcm_register(0xD40E,0x00); + set_lcm_register(0xD40F,0xF1); + set_lcm_register(0xD410,0x01); + set_lcm_register(0xD411,0x65); + set_lcm_register(0xD412,0x02); + set_lcm_register(0xD413,0x31); + set_lcm_register(0xD414,0x02); + set_lcm_register(0xD415,0x71); + set_lcm_register(0xD416,0x02); + set_lcm_register(0xD417,0xAB); + set_lcm_register(0xD418,0x02); + set_lcm_register(0xD419,0xD9); + set_lcm_register(0xD41A,0x02); + set_lcm_register(0xD41B,0xDA); + set_lcm_register(0xD41C,0x03); + set_lcm_register(0xD41D,0x01); + set_lcm_register(0xD41E,0x03); + set_lcm_register(0xD41F,0x28); + set_lcm_register(0xD420,0x03); + set_lcm_register(0xD421,0x3E); + set_lcm_register(0xD422,0x03); + set_lcm_register(0xD423,0x57); + set_lcm_register(0xD424,0x03); + set_lcm_register(0xD425,0x66); + set_lcm_register(0xD426,0x03); + set_lcm_register(0xD427,0x78); + set_lcm_register(0xD428,0x03); + set_lcm_register(0xD429,0x84); + set_lcm_register(0xD42A,0x03); + set_lcm_register(0xD42B,0x95); + set_lcm_register(0xD42C,0x03); + set_lcm_register(0xD42D,0xA2); + set_lcm_register(0xD42E,0x03); + set_lcm_register(0xD42F,0xB3); + set_lcm_register(0xD430,0x03); + set_lcm_register(0xD431,0xD7); + set_lcm_register(0xD432,0x03); + set_lcm_register(0xD433,0xFF); + + //#G - + set_lcm_register(0xD500,0x00); + set_lcm_register(0xD501,0x00); + set_lcm_register(0xD502,0x00); + set_lcm_register(0xD503,0x0D); + set_lcm_register(0xD504,0x00); + set_lcm_register(0xD505,0x10); + set_lcm_register(0xD506,0x00); + set_lcm_register(0xD507,0x1C); + set_lcm_register(0xD508,0x00); + set_lcm_register(0xD509,0x27); + set_lcm_register(0xD50A,0x00); + set_lcm_register(0xD50B,0x4F); + set_lcm_register(0xD50C,0x00); + set_lcm_register(0xD50D,0x80); + set_lcm_register(0xD50E,0x00); + set_lcm_register(0xD50F,0xF1); + set_lcm_register(0xD510,0x01); + set_lcm_register(0xD511,0x65); + set_lcm_register(0xD512,0x02); + set_lcm_register(0xD513,0x31); + set_lcm_register(0xD514,0x02); + set_lcm_register(0xD515,0x71); + set_lcm_register(0xD516,0x02); + set_lcm_register(0xD517,0xAB); + set_lcm_register(0xD518,0x02); + set_lcm_register(0xD519,0xD9); + set_lcm_register(0xD51A,0x02); + set_lcm_register(0xD51B,0xDA); + set_lcm_register(0xD51C,0x03); + set_lcm_register(0xD51D,0x01); + set_lcm_register(0xD51E,0x03); + set_lcm_register(0xD51F,0x28); + set_lcm_register(0xD520,0x03); + set_lcm_register(0xD521,0x3E); + set_lcm_register(0xD522,0x03); + set_lcm_register(0xD523,0x57); + set_lcm_register(0xD524,0x03); + set_lcm_register(0xD525,0x66); + set_lcm_register(0xD526,0x03); + set_lcm_register(0xD527,0x78); + set_lcm_register(0xD528,0x03); + set_lcm_register(0xD529,0x84); + set_lcm_register(0xD52A,0x03); + set_lcm_register(0xD52B,0x95); + set_lcm_register(0xD52C,0x03); + set_lcm_register(0xD52D,0xA2); + set_lcm_register(0xD52E,0x03); + set_lcm_register(0xD52F,0xB3); + set_lcm_register(0xD530,0x03); + set_lcm_register(0xD531,0xD7); + set_lcm_register(0xD532,0x03); + set_lcm_register(0xD533,0xFF); + + //#B - + set_lcm_register(0xD600,0x00); + set_lcm_register(0xD601,0x00); + set_lcm_register(0xD602,0x00); + set_lcm_register(0xD603,0x0D); + set_lcm_register(0xD604,0x00); + set_lcm_register(0xD605,0x10); + set_lcm_register(0xD606,0x00); + set_lcm_register(0xD607,0x1C); + set_lcm_register(0xD608,0x00); + set_lcm_register(0xD609,0x27); + set_lcm_register(0xD60A,0x00); + set_lcm_register(0xD60B,0x4F); + set_lcm_register(0xD60C,0x00); + set_lcm_register(0xD60D,0x80); + set_lcm_register(0xD60E,0x00); + set_lcm_register(0xD60F,0xF1); + set_lcm_register(0xD610,0x01); + set_lcm_register(0xD611,0x65); + set_lcm_register(0xD612,0x02); + set_lcm_register(0xD613,0x31); + set_lcm_register(0xD614,0x02); + set_lcm_register(0xD615,0x71); + set_lcm_register(0xD616,0x02); + set_lcm_register(0xD617,0xAB); + set_lcm_register(0xD618,0x02); + set_lcm_register(0xD619,0xD9); + set_lcm_register(0xD61A,0x02); + set_lcm_register(0xD61B,0xDA); + set_lcm_register(0xD61C,0x03); + set_lcm_register(0xD61D,0x01); + set_lcm_register(0xD61E,0x03); + set_lcm_register(0xD61F,0x28); + set_lcm_register(0xD620,0x03); + set_lcm_register(0xD621,0x3E); + set_lcm_register(0xD622,0x03); + set_lcm_register(0xD623,0x57); + set_lcm_register(0xD624,0x03); + set_lcm_register(0xD625,0x66); + set_lcm_register(0xD626,0x03); + set_lcm_register(0xD627,0x78); + set_lcm_register(0xD628,0x03); + set_lcm_register(0xD629,0x84); + set_lcm_register(0xD62A,0x03); + set_lcm_register(0xD62B,0x95); + set_lcm_register(0xD62C,0x03); + set_lcm_register(0xD62D,0xA2); + set_lcm_register(0xD62E,0x03); + set_lcm_register(0xD62F,0xB3); + set_lcm_register(0xD630,0x03); + set_lcm_register(0xD631,0xD7); + set_lcm_register(0xD632,0x03); + set_lcm_register(0xD633,0xFF); + + //AVDD, Set AVDD 6.2V + set_lcm_register(0xB000,0x03); + set_lcm_register(0xB001,0x03); + set_lcm_register(0xB002,0x03); + + //AVDD=3xVDCI// + set_lcm_register(0xB600,0x53); + set_lcm_register(0xB601,0x53); + set_lcm_register(0xB602,0x53); + + //VCL// + //set_lcm_register(0xB200,0x01); + //set_lcm_register(0xB201,0x01); + //set_lcm_register(0xB202,0x01); + + //set_lcm_register(0xB800,0x24); + //set_lcm_register(0xB801,0x24); + //set_lcm_register(0xB802,0x24); + + + //AVEE voltage, Set AVEE -6.2V + set_lcm_register(0xB100,0x03); + set_lcm_register(0xB101,0x03); + set_lcm_register(0xB102,0x03); + + //AVEE= -3xVDCI// + set_lcm_register(0xB700,0x44); + set_lcm_register(0xB701,0x44); + set_lcm_register(0xB702,0x44); + + //Set VGH=18V// + set_lcm_register(0xB300,0x0B); + set_lcm_register(0xB301,0x0B); + set_lcm_register(0xB302,0x0B); + + //#VGH, Set VGH 18V// + set_lcm_register(0xB900,0x34); + set_lcm_register(0xB901,0x34); + set_lcm_register(0xB902,0x34); + + //set_lcm_register(0xBF00,0x01); + + //Set VGL_REG= + set_lcm_register(0xB500,0x09); + set_lcm_register(0xB501,0x09); + set_lcm_register(0xB502,0x09); + + //#VGLX, Set VGL -11V + set_lcm_register(0xBA00,0x14); + set_lcm_register(0xBA01,0x14); + set_lcm_register(0xBA02,0x14); + + + //######################## + //#ENABLE CMD2 Page 0 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x00); + //######################## + + //#RAM Keep + set_lcm_register(0xB100,0xCC); + + //#Vivid Color + set_lcm_register(0xB400,0x10); + + //## SDT: + set_lcm_register(0xB600,0x02); + + //#Set Gate EQ + set_lcm_register(0xB700,0x70); + set_lcm_register(0xB701,0x70); + + //#Set Source EQ + set_lcm_register(0xB800,0x01); + set_lcm_register(0xB801,0x07); + set_lcm_register(0xB802,0x07); + set_lcm_register(0xB803,0x07); + + //#Inversion Control + set_lcm_register(0xBC00,0x05); + set_lcm_register(0xBC01,0x05); + set_lcm_register(0xBC02,0x05); + + //#Porch Adjust + set_lcm_register(0xBD02,0x07); + set_lcm_register(0xBD03,0x31); + set_lcm_register(0xBE02,0x07); + set_lcm_register(0xBE03,0x31); + set_lcm_register(0xBF02,0x07); + set_lcm_register(0xBF03,0x31); + + //#TE ON + set_lcm_register(0x3500,0x00); + + //#StartUp + set_lcm_register(0x1100,0x00); + MDELAY(120); + + //#Display On + set_lcm_register(0x2900,0x00); + + set_lcm_register(0x3A00,0x77); + + //######################## + //#ENABLE CMD2 Page 0 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x00); + //######################## + set_lcm_register(0xC700,0x02); + + //0xC900_0x00 or 0x16 + set_lcm_register(0xC900,0x11); + set_lcm_register(0xC903,0x00); + set_lcm_register(0xC904,0x00); + + set_lcm_register(0x2100,0x00); + + + //####################### + //#ENABLE CMD2 Page 1 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + //######################## + send_ctrl_cmd(0X1100); // + MDELAY(200); + send_ctrl_cmd(0X2900); // + MDELAY(50); + //send_ctrl_cmd(0X2C00); // + //MDELAY(20); +#else +//####################### +//#ENABLE CMD2 Page 1 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); +//######################## + +//#VGMP/VGMN/VOOM Setting, VGMP=4.8V #VGSP=0.6125V + set_lcm_register( 0xBC00,0x00); + set_lcm_register( 0xBC01,0x78); + set_lcm_register( 0xBC02,0x1A); + +//#VGMN=-4.8V #VGSN=-0.6125V + set_lcm_register( 0xBD00,0x00); + set_lcm_register( 0xBD01,0x78); + set_lcm_register( 0xBD02,0x1A); + +//#VCOM= + set_lcm_register( 0xBE01,0x49); + +//# R+ + set_lcm_register( 0xD100,0x00); + set_lcm_register( 0xD101,0x00); + set_lcm_register( 0xD102,0x00); + set_lcm_register( 0xD103,0x13); + set_lcm_register( 0xD104,0x00); + set_lcm_register( 0xD105,0x27); + set_lcm_register( 0xD106,0x00); + set_lcm_register( 0xD107,0x46); + set_lcm_register( 0xD108,0x00); + set_lcm_register( 0xD109,0x6A); + set_lcm_register( 0xD10A,0x00); + set_lcm_register( 0xD10B,0xA4); + set_lcm_register( 0xD10C,0x00); + set_lcm_register( 0xD10D,0xD5); + set_lcm_register( 0xD10E,0x01); + set_lcm_register( 0xD10F,0x1E); + set_lcm_register( 0xD110,0x01); + set_lcm_register( 0xD111,0x53); + set_lcm_register( 0xD112,0x01); + set_lcm_register( 0xD113,0x9B); + set_lcm_register( 0xD114,0x01); + set_lcm_register( 0xD115,0xCB); + set_lcm_register( 0xD116,0x02); + set_lcm_register( 0xD117,0x16); + set_lcm_register( 0xD118,0x02); + set_lcm_register( 0xD119,0x4E); + set_lcm_register( 0xD11A,0x02); + set_lcm_register( 0xD11B,0x4F); + set_lcm_register( 0xD11C,0x02); + set_lcm_register( 0xD11D,0x7F); + set_lcm_register( 0xD11E,0x02); + set_lcm_register( 0xD11F,0xB3); + set_lcm_register( 0xD120,0x02); + set_lcm_register( 0xD121,0xCF); + set_lcm_register( 0xD122,0x02); + set_lcm_register( 0xD123,0xEE); + set_lcm_register( 0xD124,0x03); + set_lcm_register( 0xD125,0x01); + set_lcm_register( 0xD126,0x03); + set_lcm_register( 0xD127,0x1B); + set_lcm_register( 0xD128,0x03); + set_lcm_register( 0xD129,0x2A); + set_lcm_register( 0xD12A,0x03); + set_lcm_register( 0xD12B,0x40); + set_lcm_register( 0xD12C,0x03); + set_lcm_register( 0xD12D,0x50); + set_lcm_register( 0xD12E,0x03); + set_lcm_register( 0xD12F,0x67); + set_lcm_register( 0xD130,0x03); + set_lcm_register( 0xD131,0xA8); + set_lcm_register( 0xD132,0x03); + set_lcm_register( 0xD133,0xD8); + + + +//#G + + set_lcm_register( 0xD200,0x00); + set_lcm_register( 0xD201,0x00 ); + set_lcm_register( 0xD202,0x00 ); + set_lcm_register( 0xD203,0x13 ); + set_lcm_register( 0xD204,0x00 ); + set_lcm_register( 0xD205,0x27 ); + set_lcm_register( 0xD206,0x00 ); + set_lcm_register( 0xD207,0x46 ); + set_lcm_register( 0xD208,0x00 ); + set_lcm_register( 0xD209,0x6A ); + set_lcm_register( 0xD20A,0x00 ); + set_lcm_register( 0xD20B,0xA4 ); + set_lcm_register( 0xD20C,0x00 ); + set_lcm_register( 0xD20D,0xD5 ); + set_lcm_register( 0xD20E,0x01 ); + set_lcm_register( 0xD20F,0x1E ); + set_lcm_register( 0xD210,0x01 ); + set_lcm_register( 0xD211,0x53 ); + set_lcm_register( 0xD212,0x01 ); + set_lcm_register( 0xD213,0x9B ); + set_lcm_register( 0xD214,0x01 ); + set_lcm_register( 0xD215,0xCB ); + set_lcm_register( 0xD216,0x02 ); + set_lcm_register( 0xD217,0x16 ); + set_lcm_register( 0xD218,0x02 ); + set_lcm_register( 0xD219,0x4E ); + set_lcm_register( 0xD21A,0x02 ); + set_lcm_register( 0xD21B,0x4F ); + set_lcm_register( 0xD21C,0x02 ); + set_lcm_register( 0xD21D,0x7F ); + set_lcm_register( 0xD21E,0x02 ); + set_lcm_register( 0xD21F,0xB3 ); + set_lcm_register( 0xD220,0x02 ); + set_lcm_register( 0xD221,0xCF ); + set_lcm_register( 0xD222,0x02); + set_lcm_register( 0xD223,0xEE ); + set_lcm_register( 0xD224,0x03 ); + set_lcm_register( 0xD225,0x01 ); + set_lcm_register( 0xD226,0x03 ); + set_lcm_register( 0xD227,0x1B ); + set_lcm_register( 0xD228,0x03 ); + set_lcm_register( 0xD229,0x2A ); + set_lcm_register( 0xD22A,0x03 ); + set_lcm_register( 0xD22B,0x40 ); + set_lcm_register( 0xD22C,0x03 ); + set_lcm_register( 0xD22D,0x50 ); + set_lcm_register( 0xD22E,0x03 ); + set_lcm_register( 0xD22F,0x67 ); + set_lcm_register( 0xD230,0x03 ); + set_lcm_register( 0xD231,0xA8 ); + set_lcm_register( 0xD232,0x03 ); + set_lcm_register( 0xD233,0xD8 ); + +//#B + + set_lcm_register( 0xD300,0x00); + set_lcm_register( 0xD301,0x00); + set_lcm_register( 0xD302,0x00); + set_lcm_register( 0xD303,0x13); + set_lcm_register( 0xD304,0x00); + set_lcm_register( 0xD305,0x27); + set_lcm_register( 0xD306,0x00); + set_lcm_register( 0xD307,0x46); + set_lcm_register( 0xD308,0x00); + set_lcm_register( 0xD309,0x6A); + set_lcm_register( 0xD30A,0x00); + set_lcm_register( 0xD30B,0xA4); + set_lcm_register( 0xD30C,0x00); + set_lcm_register( 0xD30D,0xD5); + set_lcm_register( 0xD30E,0x01); + set_lcm_register( 0xD30F,0x1E); + set_lcm_register( 0xD310,0x01); + set_lcm_register( 0xD311,0x53); + set_lcm_register( 0xD312,0x01); + set_lcm_register( 0xD313,0x9B); + set_lcm_register( 0xD314,0x01); + set_lcm_register( 0xD315,0xCB); + set_lcm_register( 0xD316,0x02); + set_lcm_register( 0xD317,0x16); + set_lcm_register( 0xD318,0x02); + set_lcm_register( 0xD319,0x4E); + set_lcm_register( 0xD31A,0x02); + set_lcm_register( 0xD31B,0x4F); + set_lcm_register( 0xD31C,0x02); + set_lcm_register( 0xD31D,0x7F); + set_lcm_register( 0xD31E,0x02); + set_lcm_register( 0xD31F,0xB3); + set_lcm_register( 0xD320,0x02); + set_lcm_register( 0xD321,0xCF); + set_lcm_register( 0xD322,0x02); + set_lcm_register( 0xD323,0xEE); + set_lcm_register( 0xD324,0x03); + set_lcm_register( 0xD325,0x01); + set_lcm_register( 0xD326,0x03); + set_lcm_register( 0xD327,0x1B); + set_lcm_register( 0xD328,0x03); + set_lcm_register( 0xD329,0x2A); + set_lcm_register( 0xD32A,0x03); + set_lcm_register( 0xD32B,0x40); + set_lcm_register( 0xD32C,0x03); + set_lcm_register( 0xD32D,0x50); + set_lcm_register( 0xD32E,0x03); + set_lcm_register( 0xD32F,0x67); + set_lcm_register( 0xD330,0x03); + set_lcm_register( 0xD331,0xA8); + set_lcm_register( 0xD332,0x03); + set_lcm_register( 0xD333,0xD8); + + +//#R - + set_lcm_register( 0xD400,0x00); + set_lcm_register( 0xD401,0x00 ); + set_lcm_register( 0xD402,0x00 ); + set_lcm_register( 0xD403,0x13 ); + set_lcm_register( 0xD404,0x00 ); + set_lcm_register( 0xD405,0x27 ); + set_lcm_register( 0xD406,0x00 ); + set_lcm_register( 0xD407,0x46 ); + set_lcm_register( 0xD408,0x00 ); + set_lcm_register( 0xD409,0x6A ); + set_lcm_register( 0xD40A,0x00 ); + set_lcm_register( 0xD40B,0xA4 ); + set_lcm_register( 0xD40C,0x00 ); + set_lcm_register( 0xD40D,0xD5 ); + set_lcm_register( 0xD40E,0x01 ); + set_lcm_register( 0xD40F,0x1E ); + set_lcm_register( 0xD410,0x01 ); + set_lcm_register( 0xD411,0x53 ); + set_lcm_register( 0xD412,0x01 ); + set_lcm_register( 0xD413,0x9B ); + set_lcm_register( 0xD414,0x01 ); + set_lcm_register( 0xD415,0xCB ); + set_lcm_register( 0xD416,0x02 ); + set_lcm_register( 0xD417,0x16 ); + set_lcm_register( 0xD418,0x02 ); + set_lcm_register( 0xD419,0x4E ); + set_lcm_register( 0xD41A,0x02 ); + set_lcm_register( 0xD41B,0x4F ); + set_lcm_register( 0xD41C,0x02 ); + set_lcm_register( 0xD41D,0x7F ); + set_lcm_register( 0xD41E,0x02 ); + set_lcm_register( 0xD41F,0xB3 ); + set_lcm_register( 0xD420,0x02 ); + set_lcm_register( 0xD421,0xCF ); + set_lcm_register( 0xD422,0x02 ); + set_lcm_register( 0xD423,0xEE ); + set_lcm_register( 0xD424,0x03 ); + set_lcm_register( 0xD425,0x01 ); + set_lcm_register( 0xD426,0x03 ); + set_lcm_register( 0xD427,0x1B ); + set_lcm_register( 0xD428,0x03 ); + set_lcm_register( 0xD429,0x2A ); + set_lcm_register( 0xD42A,0x03 ); + set_lcm_register( 0xD42B,0x40 ); + set_lcm_register( 0xD42C,0x03 ); + set_lcm_register( 0xD42D,0x50 ); + set_lcm_register( 0xD42E,0x03 ); + set_lcm_register( 0xD42F,0x67 ); + set_lcm_register( 0xD430,0x03 ); + set_lcm_register( 0xD431,0xA8 ); + set_lcm_register( 0xD432,0x03 ); + set_lcm_register( 0xD433,0xD8 ); + +//#G - + set_lcm_register( 0xD500,0x00 ); + set_lcm_register( 0xD501,0x00 ); + set_lcm_register( 0xD502,0x00 ); + set_lcm_register( 0xD503,0x13 ); + set_lcm_register( 0xD504,0x00 ); + set_lcm_register( 0xD505,0x27 ); + set_lcm_register( 0xD506,0x00 ); + set_lcm_register( 0xD507,0x46 ); + set_lcm_register( 0xD508,0x00 ); + set_lcm_register( 0xD509,0x6A ); + set_lcm_register( 0xD50A,0x00 ); + set_lcm_register( 0xD50B,0xA4 ); + set_lcm_register( 0xD50C,0x00 ); + set_lcm_register( 0xD50D,0xD5 ); + set_lcm_register( 0xD50E,0x01 ); + set_lcm_register( 0xD50F,0x1E ); + set_lcm_register( 0xD510,0x01 ); + set_lcm_register( 0xD511,0x53 ); + set_lcm_register( 0xD512,0x01 ); + set_lcm_register( 0xD513,0x9B ); + set_lcm_register( 0xD514,0x01 ); + set_lcm_register( 0xD515,0xCB ); + set_lcm_register( 0xD516,0x02 ); + set_lcm_register( 0xD517,0x16 ); + set_lcm_register( 0xD518,0x02 ); + set_lcm_register( 0xD519,0x4E ); + set_lcm_register( 0xD51A,0x02 ); + set_lcm_register( 0xD51B,0x4F ); + set_lcm_register( 0xD51C,0x02 ); + set_lcm_register( 0xD51D,0x7F ); + set_lcm_register( 0xD51E,0x02 ); + set_lcm_register( 0xD51F,0xB3 ); + set_lcm_register( 0xD520,0x02 ); + set_lcm_register( 0xD521,0xCF ); + set_lcm_register( 0xD522,0x02 ); + set_lcm_register( 0xD523,0xEE ); + set_lcm_register( 0xD524,0x03 ); + set_lcm_register( 0xD525,0x01 ); + set_lcm_register( 0xD526,0x03 ); + set_lcm_register( 0xD527,0x1B ); + set_lcm_register( 0xD528,0x03 ); + set_lcm_register( 0xD529,0x2A ); + set_lcm_register( 0xD52A,0x03 ); + set_lcm_register( 0xD52B,0x40 ); + set_lcm_register( 0xD52C,0x03 ); + set_lcm_register( 0xD52D,0x50 ); + set_lcm_register( 0xD52E,0x03 ); + set_lcm_register( 0xD52F,0x67 ); + set_lcm_register( 0xD530,0x03 ); + set_lcm_register( 0xD531,0xA8 ); + set_lcm_register( 0xD532,0x03 ); + set_lcm_register( 0xD533,0xD8 ); + +//#B - + set_lcm_register( 0xD600,0x00 ); + set_lcm_register( 0xD601,0x00 ); + set_lcm_register( 0xD602,0x00 ); + set_lcm_register( 0xD603,0x13 ); + set_lcm_register( 0xD604,0x00 ); + set_lcm_register( 0xD605,0x27 ); + set_lcm_register( 0xD606,0x00 ); + set_lcm_register( 0xD607,0x46 ); + set_lcm_register( 0xD608,0x00 ); + set_lcm_register( 0xD609,0x6A ); + set_lcm_register( 0xD60A,0x00 ); + set_lcm_register( 0xD60B,0xA4 ); + set_lcm_register( 0xD60C,0x00 ); + set_lcm_register( 0xD60D,0xD5 ); + set_lcm_register( 0xD60E,0x01 ); + set_lcm_register( 0xD60F,0x1E ); + set_lcm_register( 0xD610,0x01 ); + set_lcm_register( 0xD611,0x53 ); + set_lcm_register( 0xD612,0x01 ); + set_lcm_register( 0xD613,0x9B ); + set_lcm_register( 0xD614,0x01 ); + set_lcm_register( 0xD615,0xCB); + set_lcm_register( 0xD616,0x02); + set_lcm_register( 0xD617,0x16); + set_lcm_register( 0xD618,0x02); + set_lcm_register( 0xD619,0x4E); + set_lcm_register( 0xD61A,0x02); + set_lcm_register( 0xD61B,0x4F); + set_lcm_register( 0xD61C,0x02); + set_lcm_register( 0xD61D,0x7F); + set_lcm_register( 0xD61E,0x02); + set_lcm_register( 0xD61F,0xB3); + set_lcm_register( 0xD620,0x02); + set_lcm_register( 0xD621,0xCF); + set_lcm_register( 0xD622,0x02); + set_lcm_register( 0xD623,0xEE); + set_lcm_register( 0xD624,0x03); + set_lcm_register( 0xD625,0x01); + set_lcm_register( 0xD626,0x03); + set_lcm_register( 0xD627,0x1B); + set_lcm_register( 0xD628,0x03); + set_lcm_register( 0xD629,0x2A); + set_lcm_register( 0xD62A,0x03); + set_lcm_register( 0xD62B,0x40); + set_lcm_register( 0xD62C,0x03); + set_lcm_register( 0xD62D,0x50); + set_lcm_register( 0xD62E,0x03); + set_lcm_register( 0xD62F,0x67); + set_lcm_register( 0xD630,0x03); + set_lcm_register( 0xD631,0xA8); + set_lcm_register( 0xD632,0x03); + set_lcm_register( 0xD633,0xD8); + + +//Set AVDD Voltage// + set_lcm_register( 0xB000,0x00); + set_lcm_register( 0xB001,0x00); + set_lcm_register( 0xB002,0x00); +//AVDD=2.5xVDCI// + set_lcm_register( 0xB600,0x36); + set_lcm_register( 0xB601,0x36); + set_lcm_register( 0xB602,0x36); + +//VCL// +//REGW 0xB200,0x02 +//REGW 0xB201,0x02 +//REGW 0xB202,0x02 + set_lcm_register( 0xB800,0x26); + set_lcm_register( 0xB801,0x26); + set_lcm_register( 0xB802,0x26); + +//Set AVEE voltage// + set_lcm_register( 0xB100,0x00); + set_lcm_register( 0xB101,0x00); + set_lcm_register( 0xB102,0x00); +//AVEE= -2.5xVDCI// + set_lcm_register(0xB700,0x26); // + set_lcm_register(0xB701,0x26); + set_lcm_register(0xB702,0x26); + +//Set VGH// +//REGW 0xB300,0x0B +//REGW 0xB301,0x0B +//REGW 0xB302,0x0B +//#VGH, Set VGH 18V// + set_lcm_register(0xB900,0x34); + set_lcm_register(0xB901,0x34); + set_lcm_register(0xB902,0x34); + +//REGW 0xBF00,0x01 + +//Set VGL_REG= +//REGW 0xB500,0x09 +//REGW 0xB501,0x09 +//REGW 0xB502,0x09 + +//#VGLX, Set VGL// + set_lcm_register(0xBA00,0x16); + set_lcm_register(0xBA01,0x16); + set_lcm_register(0xBA02,0x16); + + +//######################## +//#ENABLE CMD2 Page 0 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x00); + +//######################## + +//#RAM Keep + set_lcm_register(0xB100,0xCC); + +//#Vivid Color + set_lcm_register(0xB400,0x10); + +//## SDT: + set_lcm_register(0xB600,0x07); + +//#Set Gate EQ + set_lcm_register(0xB700,0x71); + set_lcm_register(0xB701,0x71); + +//#Set Source EQ + set_lcm_register(0xB800,0x01);//0x01 + set_lcm_register(0xB801,0x05);//0x0A,LK@0314 + set_lcm_register(0xB802,0x05); + set_lcm_register(0xB803,0x05); + +//#Inversion Control + set_lcm_register(0xBC00,0x05); + set_lcm_register(0xBC01,0x05); + set_lcm_register(0xBC02,0x05); + +//#Porch Adjust + set_lcm_register(0xBD02,0x07); + set_lcm_register(0xBD03,0x31); + set_lcm_register(0xBE02,0x07); + set_lcm_register(0xBE03,0x31); + set_lcm_register(0xBF02,0x07); + set_lcm_register(0xBF03,0x31); + +//#TE ON + set_lcm_register(0x3500,0x00); + +//#StartUp + set_lcm_register( 0x1100,0x00); + MDELAY( 120); + +//#Display On + set_lcm_register(0x2900,0x00); + + set_lcm_register(0x3A00,0x77); + +//######################## +//#ENABLE CMD2 Page 0 + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x00); +//######################## + set_lcm_register( 0xC700,0x02); + +//0xC900_0x00 or 0x16 + set_lcm_register(0xC900,0x11); + set_lcm_register(0xC903,0x00); + set_lcm_register(0xC904,0x00); + + set_lcm_register(0x2100,0x00); +#endif +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 40; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 12; + params->dpi.hsync_back_porch = 8; + params->dpi.hsync_front_porch = 8; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 8; + params->dpi.vsync_front_porch = 8; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + +#ifdef BUILD_UBOOT + printf("lcm_init\r\n"); +#else + printk("lcm_init\r\n"); +#endif + + config_gpio(); + + SET_RESET_PIN(1);//LK@I3000 + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120);//LK@0314,at least 120ms + + init_lcm_registers(); + +} + + +static void lcm_suspend(void) +{ + + + send_ctrl_cmd(0X2800); // + MDELAY(150); + send_ctrl_cmd(0x1000); + MDELAY(150); + +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0X1100); // + MDELAY(150); + send_ctrl_cmd(0X2900); // + MDELAY(150); +#if 0//ndef BUILD_UBOOT + printk("APHW_CODE = 0x%x\n",get_chip_code()); + printk("APHW_VER = 0x%x\n",get_chip_eco_ver()); + printk("APSW_VER = 0x%x\n",get_chip_sw_ver()); + printk("APHW_SUBCODE = 0x%x\n",get_chip_subcode()); +#endif +} + +#if 0//def BUILD_UBOOT +#define ADC_CHECK_COUNT 5 +extern int IMM_GetOneChannelValue(int dwChannel); + +static unsigned int lcm_check_idpin_adc(unsigned char count) +{ + int idpin_auxadc = 0; + int idpin_auxadc_check = 0; + int i = 0; + + for(i = 0;i < count;i++) + { + idpin_auxadc_check = IMM_GetOneChannelValue(AUXADC_LCM_IDPIN_CHANNEL); + idpin_auxadc += idpin_auxadc_check; + printf("LK+++:LCM Check ID pin ADC value[%d]=%d\n",i,idpin_auxadc_check); + } + idpin_auxadc = (idpin_auxadc / count); + printf("LK+++:LCM Check ID pin ADC average value=%d\n",idpin_auxadc); + + return idpin_auxadc; +} +#endif + + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + + #if 0//def BUILD_UBOOT + unsigned int lcm_idpin_value = 0; + + lcm_idpin_value = lcm_check_idpin_adc(ADC_CHECK_COUNT); + #endif + + #if 1 + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120);//LK@0314,at least 120ms + #endif + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_read_data(); + + id = (id1<<8)|id2; + +#ifdef BUILD_UBOOT + printf("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#else + printk("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#endif + +#if 0 + #ifdef BUILD_UBOOT + if((LCM_ID == id) && (lcm_idpin_value > 100) && (lcm_idpin_value < 200)) + #else + if(LCM_ID == 0)//id + #endif + { + return 1; + } + else + { + return 0; + } +#endif + return (LCM_ID == id)?1:0; + +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER sr4009tn_nt35510_lcm_drv = +{ + .name = "sr4009tn_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; + + + diff --git a/acer_e350_simcom75/lcm/srl4317gn_qhd_nt35516/srl4317gn_qhd_nt35516.c b/acer_e350_simcom75/lcm/srl4317gn_qhd_nt35516/srl4317gn_qhd_nt35516.c new file mode 100644 index 0000000..a62c344 --- /dev/null +++ b/acer_e350_simcom75/lcm/srl4317gn_qhd_nt35516/srl4317gn_qhd_nt35516.c @@ -0,0 +1,1693 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +/*Extern func*/ +#if defined(ACER_C8) +/*punk add for tp*/ +extern void fts_chk_chr(void); +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + + +#ifdef BUILD_UBOOT +#define LCD_PRINT printf +#else +#define LCD_PRINT printk +#endif + + +//#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#if 0 +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#else +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) +#endif +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + + +#define PARA_MAX 40 +struct init_para_st +{ + unsigned short reg_start; + unsigned short para_cnt; + unsigned char parameters[PARA_MAX]; +}; + +static struct init_para_st init_setting[] = +{ + { + 0xff00,5, + { + 0xaa,0x55,0x25,0x01,0x01, + } + }, + { + 0xF200,35, + { + 0x00, 0x00, 0x4A, 0x0A, 0xA8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x51, 0x00, + 0x01, 0x00, 0x01, + } + }, + { + 0xF300,7, + { + 0x02, 0x03, 0x07, 0x45, 0x88, 0xD1, 0x0D, + } + }, + { + 0xF000,5, + { + 0x55, 0xAA, 0x52, 0x08, 0x00 + } + }, + { + 0xB100,3, + { + 0xCC, 0x00, 0x00, + } + }, + { + 0xB800,4, + { + 0x01, 0x02, 0x02, 0x02, + } + }, + { + 0xC900,6, + { + 0x63, 0x06, 0x0D, 0x1A, 0x17, 0x00, + } + }, + { + 0xF000,5, + { + 0x55, 0xAA, 0x52, 0x08, 0x01, + } + }, + { + 0xB000,3, + { + 0x05, 0x05, 0x05, + } + }, + { + 0xB100,3, + { + 0x05, 0x05, 0x05, + } + }, + { + 0xB200,3, + { + 0x01, 0x01, 0x01, + } + }, + { + 0xB300,3, + { + 0x0E, 0x0E, 0x0E, + } + }, + { + 0xB400,3, + { + 0x08, 0x08, 0x08, + } + }, + { + 0xB600,3, + { + 0x44, 0x44, 0x44, + } + }, + { + 0xB700,3, + { + 0x34, 0x34, 0x34, + } + }, + { + 0xB800,3, + { + 0x10, 0x10, 0x10, + } + }, + { + 0xB900,3, + { + 0x26, 0x26, 0x26, + } + }, + { + 0xBA00,3, + { + 0x34, 0x34, 0x34, + } + }, + { + 0xBC00,3, + { + 0x00, 0xC8, 0x00, + } + }, + { + 0xBD00,3, + { + 0x00, 0xC8, 0x00, + } + }, + { + 0xBE00,1, + { + 0x79,/*punk, 0x92->0x79*/ + } + }, + { + 0xC000,2, + { + 0x04, 0x00, + } + }, + { + 0xCA00,1, + { + 0x00, + } + }, + { + 0xD000,4, + { + 0x0A, 0x10, 0x0D, 0x0F, + } + }, + { + 0xD100,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xD200,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xD300,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xD400,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xD500,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xD600,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xD700,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xD800,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xD900,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xDD00,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xDE00,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xDF00,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE000,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE100,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xE200,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xE300,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE400,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE500,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xE600,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xE700,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + }, + { + 0xE800,16, + { + 0x00, 0x70, 0x00, 0xCE, 0x00, 0xF7, 0x01, 0x10, + 0x01, 0x21, 0x01, 0x44, 0x01, 0x62, 0x01, 0x8D, + } + }, + { + 0xE900,16, + { + 0x01, 0xAF, 0x01, 0xE4, 0x02, 0x0C, 0x02, 0x4D, + 0x02, 0x82, 0x02, 0x84, 0x02, 0xB8, 0x02, 0xF0, + } + }, + { + 0xEA00,16, + { + 0x03, 0x14, 0x03, 0x42, 0x03, 0x5E, 0x03, 0x80, + 0x03, 0x97, 0x03, 0xB0, 0x03, 0xC0, 0x03, 0xDF, + } + }, + { + 0xEB00,4, + { + 0x03, 0xFD, 0x03, 0xFF, + } + } +}; + + +static int init_setting_num = sizeof(init_setting)/sizeof(init_setting[0]); + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + //unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + int i,k; + +#if 0 + LCD_PRINT("%s,%s, -0 \n",__FILE__,__FUNCTION__); + + for(i=0; itype = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 54;//40?, punk 42->54 57(38M) + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; //LCM_POLARITY_FALLING -> LCM_POLARITY_RISING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + +#if 1 + /*from sunrise zhaowu, for c8*/ + params->dpi.hsync_pulse_width = 2; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 20; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 20; +#elif 1 + xx + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; +#else + xx + params->dpi.hsync_pulse_width = 12; + params->dpi.hsync_back_porch = 8; + params->dpi.hsync_front_porch = 8; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 8; + params->dpi.vsync_front_porch = 8; +#endif + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current =LCM_DRIVING_CURRENT_6575_4MA;// LCM_DRIVING_CURRENT_6575_4MA; //punk LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_hw_reset(void) +{ + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + LCD_PRINT("punk,lcm_hw_reset -1\n "); + MDELAY(60); + LCD_PRINT("punk,lcm_hw_reset -2\n "); + SET_RESET_PIN(1); + MDELAY(80); +} + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +#if 0 + xx + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(150); + send_ctrl_cmd(0x4f00); + send_data_cmd(0x01); //DSTB + +#else + LCD_PRINT("punk,lcm_suspend -1.11\n "); + /*from truly sandy*/ + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + send_ctrl_cmd(0xB100); send_data_cmd(0x4C); + send_ctrl_cmd(0x2800); + + MDELAY(100); + send_ctrl_cmd(0x1000); + MDELAY(50); +#endif +} + + +static void lcm_resume(void) +{ +#if 0 + lcm_hw_reset(); + init_lcm_registers(); +#else + LCD_PRINT("punk,lcm_resume -1.3\n "); + /*from truly sandy*/ + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + send_ctrl_cmd(0xB100); send_data_cmd(0xCC); + send_ctrl_cmd(0x1100); + MDELAY(150); + send_ctrl_cmd(0x2900); + MDELAY(50); +#endif + +/*punk, for tp issue*/ +#ifndef BUILD_UBOOT +#if defined(ACER_C8) + fts_chk_chr(); +#endif +#endif + +} + + +/*for read id adc value*/ +#if 1 //lk + +#ifdef BUILD_UBOOT + +#include "cust_adc.h" +#define ADC_CHECK_COUNT 5 +extern int IMM_GetOneChannelValue(int dwChannel); + +static unsigned int lcm_check_idpin_adc(unsigned char count) +{ + int idpin_auxadc = 0; + int idpin_auxadc_check = 0; + int i = 0; + + for(i = 0;i < count;i++) + { + idpin_auxadc_check = IMM_GetOneChannelValue(AUXADC_LCM_IDPIN_CHANNEL); + idpin_auxadc += idpin_auxadc_check; + printf("LK+++:LCM Check ID pin ADC value[%d]=%d\n",i,idpin_auxadc_check); + } + idpin_auxadc = (idpin_auxadc / count); + printf("LK+++:LCM Check ID pin ADC average value=%d\n",idpin_auxadc); + return idpin_auxadc; +} +#endif + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + +#ifdef BUILD_UBOOT + unsigned int lcm_idpin_value = 0; + + lcm_idpin_value = lcm_check_idpin_adc(ADC_CHECK_COUNT); + + if(/*(LCM == id)&&*/ lcm_idpin_value < 100)/*0v, 100=1.0v*/ + { + return 1; + } + else + { + return 0; + } +#else + return 0; +#endif +} + +#endif + + + + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER srl4317gn_qhd_nt35516_lcm_drv= +{ + + .name = "srl4317gn", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/srl5002h_wvga_otm8009a/srl5002h_wvga_otm8009a.c b/acer_e350_simcom75/lcm/srl5002h_wvga_otm8009a/srl5002h_wvga_otm8009a.c new file mode 100644 index 0000000..cf91926 --- /dev/null +++ b/acer_e350_simcom75/lcm/srl5002h_wvga_otm8009a/srl5002h_wvga_otm8009a.c @@ -0,0 +1,2106 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID 0x40 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + + +static __inline unsigned char spi_get_byte(unsigned int reg) +{ + unsigned int i; + int k; + unsigned char getbyte=0; + + // reg = (CTRL_ID | (reg & 0xFF)); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + SET_LSCE_LOW; + UDELAY(1); + + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (reg & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + reg <<= 1; + } + + UDELAY(2); + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + SET_LSCK_HIGH; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte |= (1 << k); + } + + } + + UDELAY(2); + + SET_LSDA_HIGH; + SET_LSCE_HIGH; + + return getbyte; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + +#if 1 //amy0517 + + + + set_lcm_register(0xff00,0x80); // + set_lcm_register(0xff01,0x09); // enable EXTC + set_lcm_register(0xff02,0x01); // + set_lcm_register(0xff80,0x80); // enable Orise mode + set_lcm_register(0xff81,0x09); // + set_lcm_register(0xff03,0x01); // enable SPI+I2C cmd2 read +//gamma DC + set_lcm_register(0xC582,0xA3); //REG-pump23 + set_lcm_register(0xC590,0xd6); //Pump setting (3x=D6)-->(2x=96)//v02 01/11 + set_lcm_register(0xC591,0x87); //Pump setting(VGH/VGL) + set_lcm_register(0xD800,0x73); //GVDD=4.5V + set_lcm_register(0xD801,0x71); //NGVDD=4.5V +//VCOMDC + set_lcm_register(0xd900,0x50); // VCOMDC= +//GAMMA 2.2 + set_lcm_register(0xE100,0x09);//2.2+ + set_lcm_register(0xE101,0x10); + set_lcm_register(0xE102,0x14); + set_lcm_register(0xE103,0x14); + set_lcm_register(0xE104,0x08); + set_lcm_register(0xE105,0x25); + set_lcm_register(0xE106,0x14); + set_lcm_register(0xE107,0x14); + set_lcm_register(0xE108,0x01); + set_lcm_register(0xE109,0x05); + set_lcm_register(0xE10A,0x04); + set_lcm_register(0xE10B,0x07); + set_lcm_register(0xE10C,0x14); + set_lcm_register(0xE10D,0x39); + set_lcm_register(0xE10E,0x36); + set_lcm_register(0xE10F,0x05); + + set_lcm_register(0xE100,0x09);//2.2- + set_lcm_register(0xE101,0x10); + set_lcm_register(0xE102,0x14); + set_lcm_register(0xE103,0x14); + set_lcm_register(0xE104,0x08); + set_lcm_register(0xE105,0x25); + set_lcm_register(0xE106,0x14); + set_lcm_register(0xE107,0x14); + set_lcm_register(0xE108,0x01); + set_lcm_register(0xE109,0x05); + set_lcm_register(0xE10A,0x04); + set_lcm_register(0xE10B,0x07); + set_lcm_register(0xE10C,0x14); + set_lcm_register(0xE10D,0x39); + set_lcm_register(0xE10E,0x36); + set_lcm_register(0xE10F,0x05); + + set_lcm_register(0xC181,0x66); //Frame rate 65Hz//V02 +// RGB I/F setting VSYNC for OTM8018 0x0e + set_lcm_register(0xC1a1,0x08); //external Vsync(08) /Vsync,Hsync(0c) /Vsync,Hsync,DE(0e) //V02(0e) / all included clk(0f) + set_lcm_register(0xC489,0x08); //pre-charge OFF + set_lcm_register(0xC0a3,0x04); //pre-charge //V02 + set_lcm_register(0xC481,0x83); //source bias //V02 + set_lcm_register(0xC592,0x01); //Pump45 + set_lcm_register(0xC5B1,0xA9); //DC voltage setting ;[0]GVDD output,default: 0xa8 +//-------------------------------------------------------------------------------- +// initial setting 2 < tcon_goa_wave > +//-------------------------------------------------------------------------------- +// CE8x : vst1,vst2,vst3,vst4 + set_lcm_register(0xCE80,0x85); // ce81[7:0] : vst1_shift[7:0] + set_lcm_register(0xCE81,0x03); // ce82[7:0] : 0000, vst1_width[3:0] + set_lcm_register(0xCE82,0x00); // ce83[7:0] : vst1_tchop[7:0] + set_lcm_register(0xCE83,0x84); // ce84[7:0] : vst2_shift[7:0] + set_lcm_register(0xCE84,0x03); // ce85[7:0] : 0000, vst2_width[3:0] + set_lcm_register(0xCE85,0x00); // ce86[7:0] : vst2_tchop[7:0] + set_lcm_register(0xCE86,0x83); // ce87[7:0] : vst3_shift[7:0] + set_lcm_register(0xCE87,0x03); // ce88[7:0] : 0000, vst3_width[3:0] + set_lcm_register(0xCE88,0x00); // ce89[7:0] : vst3_tchop[7:0] + set_lcm_register(0xCE89,0x82); // ce8a[7:0] : vst4_shift[7:0] + set_lcm_register(0xCE8a,0x03); // ce8b[7:0] : 0000, vst4_width[3:0] + set_lcm_register(0xCE8b,0x00); // ce8c[7:0] : vst4_tchop[7:0] +//CEAx : clka1,clka2 + set_lcm_register(0xCEa0,0x38); // cea1[7:0] : clka1_width[3:0],clka1_shift[11:8] + set_lcm_register(0xCEa1,0x02); // cea2[7:0] : clka1_shift[7:0] + set_lcm_register(0xCEa2,0x03); // cea3[7:0] : clka1_sw_tg,odd_high,flat_head,flat_tail,switch[11:8] + set_lcm_register(0xCEa3,0x21); // cea4[7:0] : clka1_switch[7:0] + set_lcm_register(0xCEa4,0x00); // cea5[7:0] : clka1_extend[7:0] + set_lcm_register(0xCEa5,0x00); // cea6[7:0] : clka1_tchop[7:0] + set_lcm_register(0xCEa6,0x00); // cea7[7:0] : clka1_tglue[7:0] + set_lcm_register(0xCEa7,0x38); // cea8[7:0] : clka2_width[3:0],clka2_shift[11:8] + set_lcm_register(0xCEa8,0x01); // cea9[7:0] : clka2_shift[7:0] + set_lcm_register(0xCEa9,0x03); // ceaa[7:0] : clka2_sw_tg,odd_high,flat_head,flat_tail,switch[11:8] + set_lcm_register(0xCEaa,0x22); // ceab[7:0] : clka2_switch[7:0] + set_lcm_register(0xCEab,0x00); // ceac[7:0] : clka2_extend + set_lcm_register(0xCEac,0x00); // cead[7:0] : clka2_tchop + set_lcm_register(0xCEad,0x00); // ceae[7:0] : clka2_tglue +//CEBx : clka3,clka4 + set_lcm_register(0xCEb0,0x38); // ceb1[7:0] : clka3_width[3:0],clka3_shift[11:8] + set_lcm_register(0xCEb1,0x00); // ceb2[7:0] : clka3_shift[7:0] + set_lcm_register(0xCEb2,0x03); // ceb3[7:0] : clka3_sw_tg,odd_high,flat_head,flat_tail,switch[11:8] + set_lcm_register(0xCEb3,0x23); // ceb4[7:0] : clka3_switch[7:0] + set_lcm_register(0xCEb4,0x00); // ceb5[7:0] : clka3_extend[7:0] + set_lcm_register(0xCEb5,0x00); // ceb6[7:0] : clka3_tchop[7:0] + set_lcm_register(0xCEb6,0x00); // ceb7[7:0] : clka3_tglue[7:0] + set_lcm_register(0xCEb7,0x30); // ceb8[7:0] : clka4_width[3:0],clka2_shift[11:8] + set_lcm_register(0xCEb8,0x00); // ceb9[7:0] : clka4_shift[7:0] + set_lcm_register(0xCEb9,0x03); // ceba[7:0] : clka4_sw_tg,odd_high,flat_head,flat_tail,switch[11:8] + set_lcm_register(0xCEba,0x24); // cebb[7:0] : clka4_switch[7:0] + set_lcm_register(0xCEbb,0x00); // cebc[7:0] : clka4_extend + set_lcm_register(0xCEbc,0x00); // cebd[7:0] : clka4_tchop + set_lcm_register(0xCEbd,0x00); // cebe[7:0] : clka4_tglue +//CECx : clkb1,clkb2 + set_lcm_register(0xCEc0,0x30); // cec1[7:0] : clkb1_width[3:0],clkb1_shift[11:8] + set_lcm_register(0xCEc1,0x01); // cec2[7:0] : clkb1_shift[7:0] + set_lcm_register(0xCEc2,0x03); // cec3[7:0] : clkb1_sw_tg,odd_high,flat_head,flat_tail,switch[11:8] + set_lcm_register(0xCEc3,0x25); // cec4[7:0] : clkb1_switch[7:0] + set_lcm_register(0xCEc4,0x00); // cec5[7:0] : clkb1_extend[7:0] + set_lcm_register(0xCEc5,0x00); // cec6[7:0] : clkb1_tchop[7:0] + set_lcm_register(0xCEc6,0x00); // cec7[7:0] : clkb1_tglue[7:0] + set_lcm_register(0xCEc7,0x30); // cec8[7:0] : clkb2_width[3:0],clkb2_shift[11:8] + set_lcm_register(0xCEc8,0x02); // cec9[7:0] : clkb2_shift[7:0] + set_lcm_register(0xCEc9,0x03); // ceca[7:0] : clkb2_sw_tg,odd_high,flat_head,flat_tail,switch[11:8] + set_lcm_register(0xCEca,0x26); // cecb[7:0] : clkb2_switch[7:0] + set_lcm_register(0xCEcb,0x00); // cecc[7:0] : clkb2_extend + set_lcm_register(0xCEcc,0x00); // cecd[7:0] : clkb2_tchop + set_lcm_register(0xCEcd,0x00); // cece[7:0] : clkb2_tglue +//CEDx : clkb3,clkb4 + set_lcm_register(0xCEd0,0x30); // ced1[7:0] : clkb3_width[3:0],clkb3_shift[11:8] + set_lcm_register(0xCEd1,0x03); // ced2[7:0] : clkb3_shift[7:0] + set_lcm_register(0xCEd2,0x03); // ced3[7:0] : clkb3_sw_tg,odd_high,flat_head,flat_tail,switch[11:8] + set_lcm_register(0xCEd3,0x27); // ced4[7:0] : clkb3_switch[7:0] + set_lcm_register(0xCEd4,0x00); // ced5[7:0] : clkb3_extend[7:0] + set_lcm_register(0xCEd5,0x00); // ced6[7:0] : clkb3_tchop[7:0] + set_lcm_register(0xCEd6,0x00); // ced7[7:0] : clkb3_tglue[7:0] + set_lcm_register(0xCEd7,0x30); // ced8[7:0] : clkb4_width[3:0],clkb4_shift[11:8] + set_lcm_register(0xCEd8,0x04); // ced9[7:0] : clkb4_shift[7:0] + set_lcm_register(0xCEd9,0x03); // ceda[7:0] : clkb4_sw_tg,odd_high,flat_head,flat_tail,switch[11:8] + set_lcm_register(0xCEda,0x28); // cedb[7:0] : clkb4_switch[7:0] + set_lcm_register(0xCEdb,0x00); // cedc[7:0] : clkb4_extend + set_lcm_register(0xCEdc,0x00); // cedd[7:0] : clkb4_tchop + set_lcm_register(0xCEdd,0x00); // cede[7:0] : clkb4_tglue +//CFCx : + set_lcm_register(0xCFc0,0x00); // cfc1[7:0] : eclk_normal_width[7:0] + set_lcm_register(0xCFc1,0x00); // cfc2[7:0] : eclk_partial_width[7:0] + set_lcm_register(0xCFc2,0x00); // cfc3[7:0] : all_normal_tchop[7:0] + set_lcm_register(0xCFc3,0x00); // cfc4[7:0] : all_partial_tchop[7:0] + set_lcm_register(0xCFc4,0x00); // cfc5[7:0] : eclk1_follow[3:0],eclk2_follow[3:0] + set_lcm_register(0xCFc5,0x00); // cfc6[7:0] : eclk3_follow[3:0],eclk4_follow[3:0] + set_lcm_register(0xCFc6,0x00); // cfc7[7:0] : 00,vstmask,vendmask,00,dir1,dir2 (0=VGL,1=VGH) + set_lcm_register(0xCFc7,0x00); // cfc8[7:0] : reg_goa_gnd_opt,reg_goa_dpgm_tail_set,reg_goa_f_gating_en,reg_goa_f_odd_gating,toggle_mod1,2,3,4 + set_lcm_register(0xCFc8,0x00); // cfc9[7:0] : duty_block[3:0],DGPM[3:0] + set_lcm_register(0xCFc9,0x00); // cfca[7:0] : reg_goa_gnd_period[7:0] +//CFDx : + set_lcm_register(0xCFd0,0x00); // cfd1[7:0] : 0000000,reg_goa_frame_odd_high + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- +// cbcx + set_lcm_register(0xCBc0,0x00); //cbc1[7:0] : enmode H-byte of sig1 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc1,0x00); //cbc2[7:0] : enmode H-byte of sig2 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc2,0x00); //cbc3[7:0] : enmode H-byte of sig3 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc3,0x00); //cbc4[7:0] : enmode H-byte of sig4 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc4,0x04); //cbc5[7:0] : enmode H-byte of sig5 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc5,0x04); //cbc6[7:0] : enmode H-byte of sig6 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc6,0x04); //cbc7[7:0] : enmode H-byte of sig7 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc7,0x04); //cbc8[7:0] : enmode H-byte of sig8 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc8,0x04); //cbc9[7:0] : enmode H-byte of sig9 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBc9,0x04); //cbca[7:0] : enmode H-byte of sig10 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBca,0x00); //cbcb[7:0] : enmode H-byte of sig11 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBcb,0x00); //cbcc[7:0] : enmode H-byte of sig12 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBcc,0x00); //cbcd[7:0] : enmode H-byte of sig13 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBcd,0x00); //cbce[7:0] : enmode H-byte of sig14 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBce,0x00); //cbcf[7:0] : enmode H-byte of sig15 (pwrof_0,pwrof_1,norm,pwron_4 ) +// cbdx + set_lcm_register(0xCBd0,0x00); //cbd1[7:0] : enmode H-byte of sig16 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd1,0x00); //cbd2[7:0] : enmode H-byte of sig17 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd2,0x00); //cbd3[7:0] : enmode H-byte of sig18 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd3,0x00); //cbd4[7:0] : enmode H-byte of sig19 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd4,0x00); //cbd5[7:0] : enmode H-byte of sig20 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd5,0x00); //cbd6[7:0] : enmode H-byte of sig21 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd6,0x00); //cbd7[7:0] : enmode H-byte of sig22 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd7,0x00); //cbd8[7:0] : enmode H-byte of sig23 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd8,0x00); //cbd9[7:0] : enmode H-byte of sig24 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBd9,0x04); //cbda[7:0] : enmode H-byte of sig25 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBda,0x04); //cbdb[7:0] : enmode H-byte of sig26 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBdb,0x04); //cbdc[7:0] : enmode H-byte of sig27 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBdc,0x04); //cbdd[7:0] : enmode H-byte of sig28 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBdd,0x04); //cbde[7:0] : enmode H-byte of sig29 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBde,0x04); //cbdf[7:0] : enmode H-byte of sig30 (pwrof_0,pwrof_1,norm,pwron_4 ) +// cbex + set_lcm_register(0xCBe0,0x00); //cbe1[7:0] : enmode H-byte of sig31 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe1,0x00); //cbe2[7:0] : enmode H-byte of sig32 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe2,0x00); //cbe3[7:0] : enmode H-byte of sig33 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe3,0x00); //cbe4[7:0] : enmode H-byte of sig34 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe4,0x00); //cbe5[7:0] : enmode H-byte of sig35 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe5,0x00); //cbe6[7:0] : enmode H-byte of sig36 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe6,0x00); //cbe7[7:0] : enmode H-byte of sig37 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe7,0x00); //cbe8[7:0] : enmode H-byte of sig38 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe8,0x00); //cbe9[7:0] : enmode H-byte of sig39 (pwrof_0,pwrof_1,norm,pwron_4 ) + set_lcm_register(0xCBe9,0x00); //cbea[7:0] : enmode H-byte of sig40 (pwrof_0,pwrof_1,norm,pwron_4 ) +// cc8x + set_lcm_register(0xCC80,0x00); //cc81[7:0] : reg setting for signal01 selection with u2d mode + set_lcm_register(0xCC81,0x00); //cc82[7:0] : reg setting for signal02 selection with u2d mode + set_lcm_register(0xCC82,0x00); //cc83[7:0] : reg setting for signal03 selection with u2d mode + set_lcm_register(0xCC83,0x00); //cc84[7:0] : reg setting for signal04 selection with u2d mode + set_lcm_register(0xCC84,0x0C); //cc85[7:0] : reg setting for signal05 selection with u2d mode + set_lcm_register(0xCC85,0x0A); //cc86[7:0] : reg setting for signal06 selection with u2d mode + set_lcm_register(0xCC86,0x10); //cc87[7:0] : reg setting for signal07 selection with u2d mode + set_lcm_register(0xCC87,0x0E); //cc88[7:0] : reg setting for signal08 selection with u2d mode + set_lcm_register(0xCC88,0x03); //cc89[7:0] : reg setting for signal09 selection with u2d mode + set_lcm_register(0xCC89,0x04); //cc8a[7:0] : reg setting for signal10 selection with u2d mode +// cc9x + set_lcm_register(0xCC90,0x00); //cc91[7:0] : reg setting for signal11 selection with u2d mode + set_lcm_register(0xCC91,0x00); //cc92[7:0] : reg setting for signal12 selection with u2d mode + set_lcm_register(0xCC92,0x00); //cc93[7:0] : reg setting for signal13 selection with u2d mode + set_lcm_register(0xCC93,0x00); //cc94[7:0] : reg setting for signal14 selection with u2d mode + set_lcm_register(0xCC94,0x00); //cc95[7:0] : reg setting for signal15 selection with u2d mode + set_lcm_register(0xCC95,0x00); //cc96[7:0] : reg setting for signal16 selection with u2d mode + set_lcm_register(0xCC96,0x00); //cc97[7:0] : reg setting for signal17 selection with u2d mode + set_lcm_register(0xCC97,0x00); //cc98[7:0] : reg setting for signal18 selection with u2d mode + set_lcm_register(0xCC98,0x00); //cc99[7:0] : reg setting for signal19 selection with u2d mode + set_lcm_register(0xCC99,0x00); //cc9a[7:0] : reg setting for signal20 selection with u2d mode + set_lcm_register(0xCC9a,0x00); //cc9b[7:0] : reg setting for signal21 selection with u2d mode + set_lcm_register(0xCC9b,0x00); //cc9c[7:0] : reg setting for signal22 selection with u2d mode + set_lcm_register(0xCC9c,0x00); //cc9d[7:0] : reg setting for signal23 selection with u2d mode + set_lcm_register(0xCC9d,0x00); //cc9e[7:0] : reg setting for signal24 selection with u2d mode + set_lcm_register(0xCC9e,0x0B); //cc9f[7:0] : reg setting for signal25 selection with u2d mode +// ccax + set_lcm_register(0xCCa0,0x09); //cca1[7:0] : reg setting for signal26 selection with u2d mode + set_lcm_register(0xCCa1,0x0F); //cca2[7:0] : reg setting for signal27 selection with u2d mode + set_lcm_register(0xCCa2,0x0D); //cca3[7:0] : reg setting for signal28 selection with u2d mode + set_lcm_register(0xCCa3,0x01); //cca4[7:0] : reg setting for signal29 selection with u2d mode + set_lcm_register(0xCCa4,0x02); //cca5[7:0] : reg setting for signal20 selection with u2d mode + set_lcm_register(0xCCa5,0x00); //cca6[7:0] : reg setting for signal31 selection with u2d mode + set_lcm_register(0xCCa6,0x00); //cca7[7:0] : reg setting for signal32 selection with u2d mode + set_lcm_register(0xCCa7,0x00); //cca8[7:0] : reg setting for signal33 selection with u2d mode + set_lcm_register(0xCCa8,0x00); //cca9[7:0] : reg setting for signal34 selection with u2d mode + set_lcm_register(0xCCa9,0x00); //ccaa[7:0] : reg setting for signal35 selection with u2d mode + set_lcm_register(0xCCaa,0x00); //ccab[7:0] : reg setting for signal36 selection with u2d mode + set_lcm_register(0xCCab,0x00); //ccac[7:0] : reg setting for signal37 selection with u2d mode + set_lcm_register(0xCCac,0x00); //ccad[7:0] : reg setting for signal38 selection with u2d mode + set_lcm_register(0xCCad,0x00); //ccae[7:0] : reg setting for signal39 selection with u2d mode + set_lcm_register(0xCCae,0x00); //ccaf[7:0] : reg setting for signal40 selection with u2d mode +// ccbx + set_lcm_register(0xCCb0,0x00); //ccb1[7:0] : reg setting for signal01 selection with d2u mode + set_lcm_register(0xCCb1,0x00); //ccb2[7:0] : reg setting for signal02 selection with d2u mode + set_lcm_register(0xCCb2,0x00); //ccb3[7:0] : reg setting for signal03 selection with d2u mode + set_lcm_register(0xCCb3,0x00); //ccb4[7:0] : reg setting for signal04 selection with d2u mode + set_lcm_register(0xCCb4,0x0D); //ccb5[7:0] : reg setting for signal05 selection with d2u mode + set_lcm_register(0xCCb5,0x0F); //ccb6[7:0] : reg setting for signal06 selection with d2u mode + set_lcm_register(0xCCb6,0x09); //ccb7[7:0] : reg setting for signal07 selection with d2u mode + set_lcm_register(0xCCb7,0x0B); //ccb8[7:0] : reg setting for signal08 selection with d2u mode + set_lcm_register(0xCCb8,0x02); //ccb9[7:0] : reg setting for signal09 selection with d2u mode + set_lcm_register(0xCCb9,0x01); //ccba[7:0] : reg setting for signal10 selection with d2u mode +// cccx + set_lcm_register(0xCCc0,0x00); //ccc1[7:0] : reg setting for signal11 selection with d2u mode + set_lcm_register(0xCCc1,0x00); //ccc2[7:0] : reg setting for signal12 selection with d2u mode + set_lcm_register(0xCCc2,0x00); //ccc3[7:0] : reg setting for signal13 selection with d2u mode + set_lcm_register(0xCCc3,0x00); //ccc4[7:0] : reg setting for signal14 selection with d2u mode + set_lcm_register(0xCCc4,0x00); //ccc5[7:0] : reg setting for signal15 selection with d2u mode + set_lcm_register(0xCCc5,0x00); //ccc6[7:0] : reg setting for signal16 selection with d2u mode + set_lcm_register(0xCCc6,0x00); //ccc7[7:0] : reg setting for signal17 selection with d2u mode + set_lcm_register(0xCCc7,0x00); //ccc8[7:0] : reg setting for signal18 selection with d2u mode + set_lcm_register(0xCCc8,0x00); //ccc9[7:0] : reg setting for signal19 selection with d2u mode + set_lcm_register(0xCCc9,0x00); //ccca[7:0] : reg setting for signal20 selection with d2u mode + set_lcm_register(0xCCca,0x00); //cccb[7:0] : reg setting for signal21 selection with d2u mode + set_lcm_register(0xCCcb,0x00); //cccc[7:0] : reg setting for signal22 selection with d2u mode + set_lcm_register(0xCCcc,0x00); //cccd[7:0] : reg setting for signal23 selection with d2u mode + set_lcm_register(0xCCcd,0x00); //ccce[7:0] : reg setting for signal24 selection with d2u mode + set_lcm_register(0xCCce,0x0E); //cccf[7:0] : reg setting for signal25 selection with d2u mode +// ccdx + set_lcm_register(0xCCd0,0x10); //ccd1[7:0] : reg setting for signal26 selection with d2u mode + set_lcm_register(0xCCd1,0x0A); //ccd2[7:0] : reg setting for signal27 selection with d2u mode + set_lcm_register(0xCCd2,0x0C); //ccd3[7:0] : reg setting for signal28 selection with d2u mode + set_lcm_register(0xCCd3,0x04); //ccd4[7:0] : reg setting for signal29 selection with d2u mode + set_lcm_register(0xCCd4,0x03); //ccd5[7:0] : reg setting for signal30 selection with d2u mode + set_lcm_register(0xCCd5,0x00); //ccd6[7:0] : reg setting for signal31 selection with d2u mode + set_lcm_register(0xCCd6,0x00); //ccd7[7:0] : reg setting for signal32 selection with d2u mode + set_lcm_register(0xCCd7,0x00); //ccd8[7:0] : reg setting for signal33 selection with d2u mode + set_lcm_register(0xCCd8,0x00); //ccd9[7:0] : reg setting for signal34 selection with d2u mode + set_lcm_register(0xCCd9,0x00); //ccda[7:0] : reg setting for signal35 selection with d2u mode + set_lcm_register(0xCCda,0x00); //ccdb[7:0] : reg setting for signal36 selection with d2u mode + set_lcm_register(0xCCdb,0x00); //ccdc[7:0] : reg setting for signal37 selection with d2u mode + set_lcm_register(0xCCdc,0x00); //ccdd[7:0] : reg setting for signal38 selection with d2u mode + set_lcm_register(0xCCdd,0x00); //ccde[7:0] : reg setting for signal39 selection with d2u mode + set_lcm_register(0xCCde,0x00); //ccdf[7:0] : reg setting for signal40 selection with d2u mode + + set_lcm_register(0x3A00,0x77); // RGB 18bits D[17:0] + set_lcm_register(0x1100,0x00); + MDELAY(150); + + + send_ctrl_cmd(0x2900); + //printf(" Display on \n"); + MDELAY(50); +#else + send_ctrl_cmd(0xff00); // + send_data_cmd(0x80); + send_ctrl_cmd(0xff01); // enable EXTC + send_data_cmd(0x09); + send_ctrl_cmd(0xff02); // + send_data_cmd(0x01); + + send_ctrl_cmd(0xff80); // enable Orise mode + send_data_cmd(0x80); + send_ctrl_cmd(0xff81); // + send_data_cmd(0x09); + //************************************************************************** + send_ctrl_cmd(0xff03); // enable SPI+I2C cmd2 read + send_data_cmd(0x01); + + send_ctrl_cmd(0xC0B4); // dot Inversion + send_data_cmd(0x00); + + send_ctrl_cmd(0xC580); // Disable auto voltage detecting + send_data_cmd(0x03); + + send_ctrl_cmd(0xC582); // Disable auto voltage detecting + send_data_cmd(0xA3); + + send_ctrl_cmd(0xc590); // pump1 X2 ratio + send_data_cmd(0x96); + + send_ctrl_cmd(0xc591); // pump1 X2 ratio + send_data_cmd(0x0F);//edit by orise FAE£¬2011.12.15 + + send_ctrl_cmd(0xc592); // pump45 + send_data_cmd(0x01); + + send_ctrl_cmd(0xc593); // VRGH/VRGL Setting + send_data_cmd(0x00); + + send_ctrl_cmd(0xc594); // pump12 clk freq(Normal) + send_data_cmd(0x33); + + send_ctrl_cmd(0xC0A3); + send_data_cmd(0x1B); + + send_ctrl_cmd(0xC481); + send_data_cmd(0x04); + + send_ctrl_cmd(0xD800); // GVDD setting + send_data_cmd(0x70); + + send_ctrl_cmd(0xD801); // NGVDD setting + send_data_cmd(0x70); + + send_ctrl_cmd(0xc5B1); + send_data_cmd(0x29); + + send_ctrl_cmd(0xD900); // Vcom setting + send_data_cmd(0x36); + + + //*********************************CE*********************************** + + send_ctrl_cmd(0xD400); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x00); + send_data_cmd(0x40); + + + //D5 setting + + + send_ctrl_cmd(0xD500); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + send_data_cmd(0x00); + send_data_cmd(0x60); + + send_ctrl_cmd(0xD680); + send_data_cmd(0x08); + //*********************************Gamma*********************************** + // Positive + send_ctrl_cmd(0xE100); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE101); + send_data_cmd(0x16); + + send_ctrl_cmd(0xE102); + send_data_cmd(0x17); + + send_ctrl_cmd(0xE103); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE104); + send_data_cmd(0x0B); + + send_ctrl_cmd(0xE105); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE106); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE107); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE108); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE109); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE10A); + send_data_cmd(0x02); + + send_ctrl_cmd(0xE10B); + send_data_cmd(0x06); + + send_ctrl_cmd(0xE10C); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE10D); + send_data_cmd(0x20); + + send_ctrl_cmd(0xE10E); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE10F); + send_data_cmd(0x16); + + + //NEGATIVE + + send_ctrl_cmd(0xE200); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE201); + send_data_cmd(0x16); + + send_ctrl_cmd(0xE202); + send_data_cmd(0x17); + + send_ctrl_cmd(0xE203); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE204); + send_data_cmd(0x0B); + + send_ctrl_cmd(0xE205); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE206); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE207); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE208); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE209); + send_data_cmd(0x05); + + send_ctrl_cmd(0xE20A); + send_data_cmd(0x02); + + send_ctrl_cmd(0xE20B); + send_data_cmd(0x07); + + send_ctrl_cmd(0xE20C); + send_data_cmd(0x0E); + + send_ctrl_cmd(0xE20D); + send_data_cmd(0x20); + + send_ctrl_cmd(0xE20E); + send_data_cmd(0x1D); + + send_ctrl_cmd(0xE20F); + send_data_cmd(0x16); + + ///////////////////////////////////////////////////////////////////// + + send_ctrl_cmd(0xb3a6); // reg_panel_zinv, reg_panel_zinv_pixel, reg_panel_zinv_odd, reg_panel_zigzag, reg_panel_zigzag_blue, reg_panel_zigzag_shift_r, reg_panel_zigzag_odd + send_data_cmd(0x20); + + send_ctrl_cmd(0xb3a7); // panel_set[0] = 1 + send_data_cmd(0x01); + + send_ctrl_cmd(0xce80);// ce81[7:0] : vst1_shift[7:0] + send_data_cmd(0x85); + send_ctrl_cmd(0xce81);// ce82[7:0] : 0000, vst1_width[3:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xce82);// ce83[7:0] : vst1_tchop[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xce83);// ce84[7:0] : vst2_shift[7:0] + send_data_cmd(0x84); + send_ctrl_cmd(0xce84);// ce85[7:0] : 0000, vst2_width[3:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xce85);// ce86[7:0] : vst2_tchop[7:0] + send_data_cmd(0x00); + + //CEAx : clka1, clka2 + + send_ctrl_cmd(0xcea0);// cea1[7:0] : clka1_width[3:0], clka1_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xcea1);// cea2[7:0] : clka1_shift[7:0] + send_data_cmd(0x04); + send_ctrl_cmd(0xcea2);// cea3[7:0] : clka1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xcea3);// cea4[7:0] : clka1_switch[7:0] + send_data_cmd(0x21); + send_ctrl_cmd(0xcea4);// cea5[7:0] : clka1_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xcea5);// cea6[7:0] : clka1_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xcea6);// cea7[7:0] : clka1_tglue[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xcea7);// cea8[7:0] : clka2_width[3:0], clka2_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xcea8);// cea9[7:0] : clka2_shift[7:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xcea9);// ceaa[7:0] : clka2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceaa);// ceab[7:0] : clka2_switch[7:0] + send_data_cmd(0x22); + send_ctrl_cmd(0xceab);// ceac[7:0] : clka2_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xceac);// cead[7:0] : clka2_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xcead);// ceae[7:0] : clka2_tglue + send_data_cmd(0x00); + +//CEBx : clka3, clka4 + send_ctrl_cmd(0xceb0);// ceb1[7:0] : clka3_width[3:0], clka3_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xceb1);// ceb2[7:0] : clka3_shift[7:0] + send_data_cmd(0x02); + send_ctrl_cmd(0xceb2);// ceb3[7:0] : clka3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceb3);// ceb4[7:0] : clka3_switch[7:0] + send_data_cmd(0x23); + send_ctrl_cmd(0xceb4);// ceb5[7:0] : clka3_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xceb5);// ceb6[7:0] : clka3_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xceb6);// ceb7[7:0] : clka3_tglue[7:0] + send_data_cmd(0x00); + + send_ctrl_cmd(0xceb7);// ceb8[7:0] : clka4_width[3:0], clka2_shift[11:8] + send_data_cmd(0x18); + send_ctrl_cmd(0xceb8);// ceb9[7:0] : clka4_shift[7:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xceb9);// ceba[7:0] : clka4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xceba);// cebb[7:0] : clka4_switch[7:0] + send_data_cmd(0x24); + send_ctrl_cmd(0xcebb);// cebc[7:0] : clka4_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xcebc);// cebd[7:0] : clka4_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xcebd);// cebe[7:0] : clka4_tglue + send_data_cmd(0x00); + + +//CFCx : + send_ctrl_cmd(0xcfc0);// cfc1[7:0] : eclk_normal_width[7:0] + send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc1);// cfc2[7:0] : eclk_partial_width[7:0] send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc2);// cfc3[7:0] : all_normal_tchop[7:0] send_data_cmd(0x20); + + send_ctrl_cmd(0xcfc3);// cfc4[7:0] : all_partial_tchop[7:0] send_data_cmd(0x20); + + send_ctrl_cmd(0xcfc4);// cfc5[7:0] : eclk1_follow[3:0], eclk2_follow[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc5);// cfc6[7:0] : eclk3_follow[3:0], eclk4_follow[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc6);// cfc7[7:0] : 00, vstmask, vendmask, 00, dir1, dir2 (0=VGL, 1=VGH) send_data_cmd(0x01); + + send_ctrl_cmd(0xcfc7);// cfc8[7:0] : reg_goa_gnd_opt, reg_goa_dpgm_tail_set, reg_goa_f_gating_en, reg_goa_f_odd_gating, toggle_mod1, 2, 3, 4 + send_data_cmd(0x00); // GND OPT1 (00-->80 2011/10/28) + + send_ctrl_cmd(0xcfc8);// cfc9[7:0] : duty_block[3:0], DGPM[3:0] send_data_cmd(0x00); + + send_ctrl_cmd(0xcfc9);// cfca[7:0] : reg_goa_gnd_period[7:0] send_data_cmd(0x00); // Gate PCH (CLK base) (00-->0a 2011/10/28) + +//CFDx : + send_ctrl_cmd(0xcfd0);// cfd1[7:0] : 0000000, reg_goa_frame_odd_high + send_data_cmd(0x00); + + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- + +// CB8x + send_ctrl_cmd(0xcb80);//cb81[7:0] : signal mode setting of sig4, sig3, sig2, sig1 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb81);//cb82[7:0] : signal mode setting of sig8, sig7, sig6, sig5 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb82);//cb83[7:0] : signal mode setting of sig12, sig11, sig10, sig9 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb83);//cb84[7:0] : signal mode setting of sig16, sig15, sig14, sig13 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb84);//cb85[7:0] : signal mode setting of sig20, sig19, sig18, sig17 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb85);//cb86[7:0] : signal mode setting of sig24, sig23, sig22, sig21 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb86);//cb87[7:0] : signal mode setting of sig28, sig27, sig26, sig25 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb87);//cb88[7:0] : signal mode setting of sig32, sig31, sig30, sig29 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb88);//cb89[7:0] : signal mode setting of sig36, sig35, sig34, sig33 ( sleep in ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb89);//cb8a[7:0] : signal mode setting of sig40, sig39, sig38, sig37 ( sleep in ) + send_data_cmd(0x00); + +// cb9x + send_ctrl_cmd(0xcb90);//cb91[7:0] : enmode L-byte of sig1 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb91);//cb92[7:0] : enmode L-byte of sig2 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb92);//cb93[7:0] : enmode L-byte of sig3 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb93);//cb94[7:0] : enmode L-byte of sig4 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb94);//cb95[7:0] : enmode L-byte of sig5 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb95);//cb96[7:0] : enmode L-byte of sig6 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb96);//cb97[7:0] : enmode L-byte of sig7 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb97);//cb98[7:0] : enmode L-byte of sig8 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb98);//cb99[7:0] : enmode L-byte of sig9 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb99);//cb9a[7:0] : enmode L-byte of sig10 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9a);//cb9b[7:0] : enmode L-byte of sig11 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9b);//cb9c[7:0] : enmode L-byte of sig12 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9c);//cb9d[7:0] : enmode L-byte of sig13 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9d);//cb9e[7:0] : enmode L-byte of sig14 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcb9e);//cb9f[7:0] : enmode L-byte of sig15 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbax + send_ctrl_cmd(0xcba0);//cba1[7:0] : enmode L-byte of sig16 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba1);//cba2[7:0] : enmode L-byte of sig17 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba2);//cba3[7:0] : enmode L-byte of sig18 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba3);//cba4[7:0] : enmode L-byte of sig19 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba4);//cba5[7:0] : enmode L-byte of sig20 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba5);//cba6[7:0] : enmode L-byte of sig21 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba6);//cba7[7:0] : enmode L-byte of sig22 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba7);//cba8[7:0] : enmode L-byte of sig23 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba8);//cba9[7:0] : enmode L-byte of sig24 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcba9);//cbaa[7:0] : enmode L-byte of sig25 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbaa);//cbab[7:0] : enmode L-byte of sig26 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbab);//cbac[7:0] : enmode L-byte of sig27 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbac);//cbad[7:0] : enmode L-byte of sig28 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbad);//cbae[7:0] : enmode L-byte of sig29 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbae);//cbaf[7:0] : enmode L-byte of sig30 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbbx + send_ctrl_cmd(0xcbb0);//cbb1[7:0] : enmode L-byte of sig31 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb1);//cbb2[7:0] : enmode L-byte of sig32 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb2);//cbb3[7:0] : enmode L-byte of sig33 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb3);//cbb4[7:0] : enmode L-byte of sig34 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb4);//cbb5[7:0] : enmode L-byte of sig35 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb5);//cbb6[7:0] : enmode L-byte of sig36 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb6);//cbb7[7:0] : enmode L-byte of sig37 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb7);//cbb8[7:0] : enmode L-byte of sig38 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb8);//cbb9[7:0] : enmode L-byte of sig39 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbb9);//cbba[7:0] : enmode L-byte of sig40 (pwron_3, pwron_2, pwron_1, pwron_0 ) + send_data_cmd(0x00); + +// cbcx + send_ctrl_cmd(0xcbc0);//cbc1[7:0] : enmode H-byte of sig1 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc1);//cbc2[7:0] : enmode H-byte of sig2 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc2);//cbc3[7:0] : enmode H-byte of sig3 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc3);//cbc4[7:0] : enmode H-byte of sig4 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc4);//cbc5[7:0] : enmode H-byte of sig5 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc5);//cbc6[7:0] : enmode H-byte of sig6 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbc6);//cbc7[7:0] : enmode H-byte of sig7 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc7);//cbc8[7:0] : enmode H-byte of sig8 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc8);//cbc9[7:0] : enmode H-byte of sig9 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbc9);//cbca[7:0] : enmode H-byte of sig10 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbca);//cbcb[7:0] : enmode H-byte of sig11 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcb);//cbcc[7:0] : enmode H-byte of sig12 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcc);//cbcd[7:0] : enmode H-byte of sig13 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbcd);//cbce[7:0] : enmode H-byte of sig14 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbce);//cbcf[7:0] : enmode H-byte of sig15 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + +// cbdx + send_ctrl_cmd(0xcbd0);//cbd1[7:0] : enmode H-byte of sig16 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd1);//cbd2[7:0] : enmode H-byte of sig17 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd2);//cbd3[7:0] : enmode H-byte of sig18 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd3);//cbd4[7:0] : enmode H-byte of sig19 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd4);//cbd5[7:0] : enmode H-byte of sig20 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd5);//cbd6[7:0] : enmode H-byte of sig21 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbd6);//cbd7[7:0] : enmode H-byte of sig22 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd7);//cbd8[7:0] : enmode H-byte of sig23 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd8);//cbd9[7:0] : enmode H-byte of sig24 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbd9);//cbda[7:0] : enmode H-byte of sig25 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbda);//cbdb[7:0] : enmode H-byte of sig26 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xcbdb);//cbdc[7:0] : enmode H-byte of sig27 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbdc);//cbdd[7:0] : enmode H-byte of sig28 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbdd);//cbde[7:0] : enmode H-byte of sig29 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbde);//cbdf[7:0] : enmode H-byte of sig30 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + +// cbex + send_ctrl_cmd(0xcbe0);//cbe1[7:0] : enmode H-byte of sig31 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe1);//cbe2[7:0] : enmode H-byte of sig32 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe2);//cbe3[7:0] : enmode H-byte of sig33 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe3);//cbe4[7:0] : enmode H-byte of sig34 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe4);//cbe5[7:0] : enmode H-byte of sig35 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe5);//cbe6[7:0] : enmode H-byte of sig36 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe6);//cbe7[7:0] : enmode H-byte of sig37 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe7);//cbe8[7:0] : enmode H-byte of sig38 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe8);//cbe9[7:0] : enmode H-byte of sig39 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + send_ctrl_cmd(0xcbe9);//cbea[7:0] : enmode H-byte of sig40 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x00); + + +// cbfx + send_ctrl_cmd(0xcbf0);//cbf1[7:0] : lvd enmode of ( sig4, sig3, sig2, sig1) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf1);//cbf2[7:0] : lvd enmode of ( sig8, sig7, sig6, sig5) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf2);//cbf3[7:0] : lvd enmode of (sig12, sig11, sig10, sig9) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf3);//cbf4[7:0] : lvd enmode of (sig16, sig15, sig14, sig13) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf4);//cbf5[7:0] : lvd enmode of (sig20, sig19, sig18, sig17) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf5);//cbf6[7:0] : lvd enmode of (sig24, sig23, sig22, sig21) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf6);//cbf7[7:0] : lvd enmode of (sig28, sig27, sig26, sig25) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf7);//cbf8[7:0] : lvd enmode of (sig32, sig31, sig30, sig29) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf8);//cbf9[7:0] : lvd enmode of (sig36, sig35, sig34, sig33) + send_data_cmd(0xFF); + send_ctrl_cmd(0xcbf9);//cbfa[7:0] : lvd enmode of (sig40, sig39, sig38, sig37) + send_data_cmd(0xFF); + +// cc8x + send_ctrl_cmd(0xcc80);//cc81[7:0] : reg setting for signal01 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc81);//cc82[7:0] : reg setting for signal02 selection with u2d mode + send_data_cmd(0x26); + send_ctrl_cmd(0xcc82);//cc83[7:0] : reg setting for signal03 selection with u2d mode + send_data_cmd(0x09); + send_ctrl_cmd(0xcc83);//cc84[7:0] : reg setting for signal04 selection with u2d mode + send_data_cmd(0x0B); + send_ctrl_cmd(0xcc84);//cc85[7:0] : reg setting for signal05 selection with u2d mode + send_data_cmd(0x01); + send_ctrl_cmd(0xcc85);//cc86[7:0] : reg setting for signal06 selection with u2d mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcc86);//cc87[7:0] : reg setting for signal07 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc87);//cc88[7:0] : reg setting for signal08 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc88);//cc89[7:0] : reg setting for signal09 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc89);//cc8a[7:0] : reg setting for signal10 selection with u2d mode + send_data_cmd(0x00); + +// cc9x + send_ctrl_cmd(0xcc90);//cc91[7:0] : reg setting for signal11 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc91);//cc92[7:0] : reg setting for signal12 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc92);//cc93[7:0] : reg setting for signal13 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc93);//cc94[7:0] : reg setting for signal14 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc94);//cc95[7:0] : reg setting for signal15 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc95);//cc96[7:0] : reg setting for signal16 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc96);//cc97[7:0] : reg setting for signal17 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc97);//cc98[7:0] : reg setting for signal18 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc98);//cc99[7:0] : reg setting for signal19 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc99);//cc9a[7:0] : reg setting for signal20 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc9a);//cc9b[7:0] : reg setting for signal21 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcc9b);//cc9c[7:0] : reg setting for signal22 selection with u2d mode + send_data_cmd(0x26); + send_ctrl_cmd(0xcc9c);//cc9d[7:0] : reg setting for signal23 selection with u2d mode + send_data_cmd(0x0A); + send_ctrl_cmd(0xcc9d);//cc9e[7:0] : reg setting for signal24 selection with u2d mode + send_data_cmd(0x0C); + send_ctrl_cmd(0xcc9e);//cc9f[7:0] : reg setting for signal25 selection with u2d mode + send_data_cmd(0x02); + +// ccax + send_ctrl_cmd(0xcca0);//cca1[7:0] : reg setting for signal26 selection with u2d mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcca1);//cca2[7:0] : reg setting for signal27 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca2);//cca3[7:0] : reg setting for signal28 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca3);//cca4[7:0] : reg setting for signal29 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca4);//cca5[7:0] : reg setting for signal20 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca5);//cca6[7:0] : reg setting for signal31 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca6);//cca7[7:0] : reg setting for signal32 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca7);//cca8[7:0] : reg setting for signal33 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca8);//cca9[7:0] : reg setting for signal34 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcca9);//ccaa[7:0] : reg setting for signal35 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccaa);//ccab[7:0] : reg setting for signal36 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccab);//ccac[7:0] : reg setting for signal37 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccac);//ccad[7:0] : reg setting for signal38 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccad);//ccae[7:0] : reg setting for signal39 selection with u2d mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccae);//ccaf[7:0] : reg setting for signal40 selection with u2d mode + send_data_cmd(0x00); + +// ccbx + send_ctrl_cmd(0xccb0);//ccb1[7:0] : reg setting for signal01 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb1);//ccb2[7:0] : reg setting for signal02 selection with d2u mode + send_data_cmd(0x25); + send_ctrl_cmd(0xccb2);//ccb3[7:0] : reg setting for signal03 selection with d2u mode + send_data_cmd(0x0C); + send_ctrl_cmd(0xccb3);//ccb4[7:0] : reg setting for signal04 selection with d2u mode + send_data_cmd(0x0A); + send_ctrl_cmd(0xccb4);//ccb5[7:0] : reg setting for signal05 selection with d2u mode + send_data_cmd(0x02); + send_ctrl_cmd(0xccb5);//ccb6[7:0] : reg setting for signal06 selection with d2u mode + send_data_cmd(0x26); + send_ctrl_cmd(0xccb6);//ccb7[7:0] : reg setting for signal07 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb7);//ccb8[7:0] : reg setting for signal08 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb8);//ccb9[7:0] : reg setting for signal09 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccb9);//ccba[7:0] : reg setting for signal10 selection with d2u mode + send_data_cmd(0x00); + +// cccx + send_ctrl_cmd(0xccc0);//ccc1[7:0] : reg setting for signal11 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc1);//ccc2[7:0] : reg setting for signal12 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc2);//ccc3[7:0] : reg setting for signal13 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc3);//ccc4[7:0] : reg setting for signal14 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc4);//ccc5[7:0] : reg setting for signal15 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc5);//ccc6[7:0] : reg setting for signal16 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc6);//ccc7[7:0] : reg setting for signal17 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc7);//ccc8[7:0] : reg setting for signal18 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc8);//ccc9[7:0] : reg setting for signal19 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccc9);//ccca[7:0] : reg setting for signal20 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccca);//cccb[7:0] : reg setting for signal21 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xcccb);//cccc[7:0] : reg setting for signal22 selection with d2u mode + send_data_cmd(0x25); + send_ctrl_cmd(0xcccc);//cccd[7:0] : reg setting for signal23 selection with d2u mode + send_data_cmd(0x0B); + send_ctrl_cmd(0xcccd);//ccce[7:0] : reg setting for signal24 selection with d2u mode + send_data_cmd(0x09); + send_ctrl_cmd(0xccce);//cccf[7:0] : reg setting for signal25 selection with d2u mode + send_data_cmd(0x01); + +// ccdx + send_ctrl_cmd(0xccd0);//ccd1[7:0] : reg setting for signal26 selection with d2u mode + send_data_cmd(0x26); + send_ctrl_cmd(0xccd1);//ccd2[7:0] : reg setting for signal27 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd2);//ccd3[7:0] : reg setting for signal28 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd3);//ccd4[7:0] : reg setting for signal29 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd4);//ccd5[7:0] : reg setting for signal30 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd5);//ccd6[7:0] : reg setting for signal31 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd6);//ccd7[7:0] : reg setting for signal32 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd7);//ccd8[7:0] : reg setting for signal33 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd8);//ccd9[7:0] : reg setting for signal34 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccd9);//ccda[7:0] : reg setting for signal35 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccda);//ccdb[7:0] : reg setting for signal36 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdb);//ccdc[7:0] : reg setting for signal37 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdc);//ccdd[7:0] : reg setting for signal38 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccdd);//ccde[7:0] : reg setting for signal39 selection with d2u mode + send_data_cmd(0x00); + send_ctrl_cmd(0xccde);//ccdf[7:0] : reg setting for signal40 selection with d2u mode + send_data_cmd(0x00); + MDELAY(12); + + send_ctrl_cmd(0x3600); + send_data_cmd(0x00); + + send_ctrl_cmd(0xc181); + send_data_cmd(0x66); + + send_ctrl_cmd(0xc5B1); + send_data_cmd(0x29); + + send_ctrl_cmd(0xb282); + send_data_cmd(0x20); + + send_ctrl_cmd(0xc082); + send_data_cmd(0x00); + + send_ctrl_cmd(0xc083); + send_data_cmd(0x16); + + send_ctrl_cmd(0xc084); + send_data_cmd(0x08); + + send_ctrl_cmd(0xc1A1); + send_data_cmd(0x08); + + send_ctrl_cmd(0xCFC7); + send_data_cmd(0x02); + + send_ctrl_cmd(0x1100); + // printf(" Sleep out \n"); + MDELAY(150); + + send_ctrl_cmd(0x2900); + //printf(" Display on \n"); + MDELAY(50); +#endif +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + // lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0);//input + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, 0); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; //LCM_POLARITY_FALLING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; //LCM_POLARITY_FALLING amy0518 + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 2; //22 + params->dpi.hsync_back_porch = 26 ; //12; + params->dpi.hsync_front_porch = 26 ; //16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 20; //33; + params->dpi.vsync_front_porch = 20; //12; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(200); + + send_ctrl_cmd(0xda00); + id = spi_get_byte(0xc0); //spi_read_data(); + MDELAY(20); + +#ifdef BUILD_UBOOT + printf("lcd_id=%x \r\n",id); +#else + printk("lcd_id=%x \r\n",id); +#endif + + return (LCM_ID == id)?1:0; +} + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(100); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER srl5002h_wvga_otm8009a_lcm_drv = +{ + + .name = "srl5002h_wvga_otm8009a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id, +}; + diff --git a/acer_e350_simcom75/lcm/srl5002hn_wvga_nt35510/srl5002hn_wvga_nt35510.c b/acer_e350_simcom75/lcm/srl5002hn_wvga_nt35510/srl5002hn_wvga_nt35510.c new file mode 100644 index 0000000..9668f3f --- /dev/null +++ b/acer_e350_simcom75/lcm/srl5002hn_wvga_nt35510/srl5002hn_wvga_nt35510.c @@ -0,0 +1,857 @@ + +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + + +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x5510 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_read_data(void) +{ + unsigned int i; + int k=0; + unsigned int getbyte1=0; + unsigned int data=0; + +#ifdef BUILD_UBOOT + printf("spi_read_data \r\n"); +#endif + + data = 0xc0; + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + SET_LA0_INPUT; + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 7)) + { + SET_LSDA_HIGH; + } + else + { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } +#if 0 + for(i=8;i>0;i--) + { + SET_LSCK_LOW; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#endif + UDELAY(5); + for (k = 7; k >=0; k--) + { + SET_LSCK_LOW; + if (GET_LSA0_BIT) + { + getbyte1 |= (1 << k); + } + + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#ifdef BUILD_UBOOT + printf("getbyte1=0x%x \r\n",getbyte1); +#endif + SET_LSDA_HIGH; + SET_LSCE_HIGH; + return getbyte1; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + +//LV2 Page 1 enable +set_lcm_register(0xF000,0x55); +set_lcm_register(0xF001,0xAA); +set_lcm_register(0xF002,0x52); +set_lcm_register(0xF003,0x08); +set_lcm_register(0xF004,0x01); + +//AVDD Set AVDD 5.2V +set_lcm_register(0xB000,0x0D); +set_lcm_register(0xB001,0x0D); +set_lcm_register(0xB002,0x0D); + +//AVDD ratio +set_lcm_register(0xB600,0x34); +set_lcm_register(0xB601,0x34); +set_lcm_register(0xB602,0x34); + +//AVEE -5.2V +set_lcm_register(0xB100,0x0D); +set_lcm_register(0xB101,0x0D); +set_lcm_register(0xB102,0x0D); + +//AVEE ratio +set_lcm_register(0xB700,0x34); +set_lcm_register(0xB701,0x34); +set_lcm_register(0xB702,0x34); + +//VCL -2.5V +set_lcm_register(0xB200,0x00); +set_lcm_register(0xB201,0x00); +set_lcm_register(0xB202,0x00); + +//VCL ratio +set_lcm_register(0xB800,0x24); +set_lcm_register(0xB801,0x24); +set_lcm_register(0xB802,0x24); + + +//VGH 15V (Free pump) +set_lcm_register(0xBF00,0x01); +set_lcm_register(0xB300,0x0F); +set_lcm_register(0xB301,0x0F); +set_lcm_register(0xB302,0x0F); + +//VGH ratio +set_lcm_register(0xB900,0x34); +set_lcm_register(0xB901,0x34); +set_lcm_register(0xB902,0x34); + +//VGL_REG -10V +set_lcm_register(0xB500,0x08); +set_lcm_register(0xB501,0x08); +set_lcm_register(0xB502,0x08); +set_lcm_register(0xC200,0x03); + +//VGLX ratio +set_lcm_register(0xBA00,0x24); +set_lcm_register(0xBA01,0x24); +set_lcm_register(0xBA02,0x24); + +//VGMP/VGSP 4.5V/0V +set_lcm_register(0xBC00,0x00); +set_lcm_register(0xBC01,0x78); +set_lcm_register(0xBC02,0x00); + +//VGMN/VGSN -4.5V/0V +set_lcm_register(0xBD00,0x00); +set_lcm_register(0xBD01,0x78); +set_lcm_register(0xBD02,0x00); + +//VCOM -1.25V +set_lcm_register(0xBE00,0x00); +set_lcm_register(0xBE01,0x67); + +//Gamma Setting +set_lcm_register(0xD100,0x00); +set_lcm_register(0xD101,0x32); +set_lcm_register(0xD102,0x00); +set_lcm_register(0xD103,0x33); +set_lcm_register(0xD104,0x00); +set_lcm_register(0xD105,0x41); +set_lcm_register(0xD106,0x00); +set_lcm_register(0xD107,0x5A); +set_lcm_register(0xD108,0x00); +set_lcm_register(0xD109,0x76); +set_lcm_register(0xD10A,0x00); +set_lcm_register(0xD10B,0xA7); +set_lcm_register(0xD10C,0x00); +set_lcm_register(0xD10D,0xCF); +set_lcm_register(0xD10E,0x01); +set_lcm_register(0xD10F,0x09); +set_lcm_register(0xD110,0x01); +set_lcm_register(0xD111,0x36); +set_lcm_register(0xD112,0x01); +set_lcm_register(0xD113,0x73); +set_lcm_register(0xD114,0x01); +set_lcm_register(0xD115,0x9F); +set_lcm_register(0xD116,0x01); +set_lcm_register(0xD117,0xDF); +set_lcm_register(0xD118,0x02); +set_lcm_register(0xD119,0x10); +set_lcm_register(0xD11A,0x02); +set_lcm_register(0xD11B,0x11); +set_lcm_register(0xD11C,0x02); +set_lcm_register(0xD11D,0x3D); +set_lcm_register(0xD11E,0x02); +set_lcm_register(0xD11F,0x69); +set_lcm_register(0xD120,0x02); +set_lcm_register(0xD121,0x81); +set_lcm_register(0xD122,0x02); +set_lcm_register(0xD123,0x9D); +set_lcm_register(0xD124,0x02); +set_lcm_register(0xD125,0xAD); +set_lcm_register(0xD126,0x02); +set_lcm_register(0xD127,0xC3); +set_lcm_register(0xD128,0x02); +set_lcm_register(0xD129,0xD0); +set_lcm_register(0xD12A,0x02); +set_lcm_register(0xD12B,0xE2); +set_lcm_register(0xD12C,0x02); +set_lcm_register(0xD12D,0xEE); +set_lcm_register(0xD12E,0x03); +set_lcm_register(0xD12F,0x01); +set_lcm_register(0xD130,0x03); +set_lcm_register(0xD131,0x26); +set_lcm_register(0xD132,0x03); +set_lcm_register(0xD133,0x8E); +set_lcm_register(0xD200,0x00); +set_lcm_register(0xD201,0x32); +set_lcm_register(0xD202,0x00); +set_lcm_register(0xD203,0x33); +set_lcm_register(0xD204,0x00); +set_lcm_register(0xD205,0x41); +set_lcm_register(0xD206,0x00); +set_lcm_register(0xD207,0x5A); +set_lcm_register(0xD208,0x00); +set_lcm_register(0xD209,0x76); +set_lcm_register(0xD20A,0x00); +set_lcm_register(0xD20B,0xA7); +set_lcm_register(0xD20C,0x00); +set_lcm_register(0xD20D,0xCF); +set_lcm_register(0xD20E,0x01); +set_lcm_register(0xD20F,0x09); +set_lcm_register(0xD210,0x01); +set_lcm_register(0xD211,0x36); +set_lcm_register(0xD212,0x01); +set_lcm_register(0xD213,0x73); +set_lcm_register(0xD214,0x01); +set_lcm_register(0xD215,0x9F); +set_lcm_register(0xD216,0x01); +set_lcm_register(0xD217,0xDF); +set_lcm_register(0xD218,0x02); +set_lcm_register(0xD219,0x10); +set_lcm_register(0xD21A,0x02); +set_lcm_register(0xD21B,0x11); +set_lcm_register(0xD21C,0x02); +set_lcm_register(0xD21D,0x3D); +set_lcm_register(0xD21E,0x02); +set_lcm_register(0xD21F,0x69); +set_lcm_register(0xD220,0x02); +set_lcm_register(0xD221,0x81); +set_lcm_register(0xD222,0x02); +set_lcm_register(0xD223,0x9D); +set_lcm_register(0xD224,0x02); +set_lcm_register(0xD225,0xAD); +set_lcm_register(0xD226,0x02); +set_lcm_register(0xD227,0xC3); +set_lcm_register(0xD228,0x02); +set_lcm_register(0xD229,0xD0); +set_lcm_register(0xD22A,0x02); +set_lcm_register(0xD22B,0xE2); +set_lcm_register(0xD22C,0x02); +set_lcm_register(0xD22D,0xEE); +set_lcm_register(0xD22E,0x03); +set_lcm_register(0xD22F,0x01); +set_lcm_register(0xD230,0x03); +set_lcm_register(0xD231,0x26); +set_lcm_register(0xD232,0x03); +set_lcm_register(0xD233,0x8E); +set_lcm_register(0xD300,0x00); +set_lcm_register(0xD301,0x32); +set_lcm_register(0xD302,0x00); +set_lcm_register(0xD303,0x33); +set_lcm_register(0xD304,0x00); +set_lcm_register(0xD305,0x41); +set_lcm_register(0xD306,0x00); +set_lcm_register(0xD307,0x5A); +set_lcm_register(0xD308,0x00); +set_lcm_register(0xD309,0x76); +set_lcm_register(0xD30A,0x00); +set_lcm_register(0xD30B,0xA7); +set_lcm_register(0xD30C,0x00); +set_lcm_register(0xD30D,0xCF); +set_lcm_register(0xD30E,0x01); +set_lcm_register(0xD30F,0x09); +set_lcm_register(0xD310,0x01); +set_lcm_register(0xD311,0x36); +set_lcm_register(0xD312,0x01); +set_lcm_register(0xD313,0x73); +set_lcm_register(0xD314,0x01); +set_lcm_register(0xD315,0x9F); +set_lcm_register(0xD316,0x01); +set_lcm_register(0xD317,0xDF); +set_lcm_register(0xD318,0x02); +set_lcm_register(0xD319,0x10); +set_lcm_register(0xD31A,0x02); +set_lcm_register(0xD31B,0x11); +set_lcm_register(0xD31C,0x02); +set_lcm_register(0xD31D,0x3D); +set_lcm_register(0xD31E,0x02); +set_lcm_register(0xD31F,0x69); +set_lcm_register(0xD320,0x02); +set_lcm_register(0xD321,0x81); +set_lcm_register(0xD322,0x02); +set_lcm_register(0xD323,0x9D); +set_lcm_register(0xD324,0x02); +set_lcm_register(0xD325,0xAD); +set_lcm_register(0xD326,0x02); +set_lcm_register(0xD327,0xC3); +set_lcm_register(0xD328,0x02); +set_lcm_register(0xD329,0xD0); +set_lcm_register(0xD32A,0x02); +set_lcm_register(0xD32B,0xE2); +set_lcm_register(0xD32C,0x02); +set_lcm_register(0xD32D,0xEE); +set_lcm_register(0xD32E,0x03); +set_lcm_register(0xD32F,0x01); +set_lcm_register(0xD330,0x03); +set_lcm_register(0xD331,0x26); +set_lcm_register(0xD332,0x03); +set_lcm_register(0xD333,0x8E); +set_lcm_register(0xD400,0x00); +set_lcm_register(0xD401,0x32); +set_lcm_register(0xD402,0x00); +set_lcm_register(0xD403,0x33); +set_lcm_register(0xD404,0x00); +set_lcm_register(0xD405,0x41); +set_lcm_register(0xD406,0x00); +set_lcm_register(0xD407,0x5A); +set_lcm_register(0xD408,0x00); +set_lcm_register(0xD409,0x76); +set_lcm_register(0xD40A,0x00); +set_lcm_register(0xD40B,0xA7); +set_lcm_register(0xD40C,0x00); +set_lcm_register(0xD40D,0xCF); +set_lcm_register(0xD40E,0x01); +set_lcm_register(0xD40F,0x09); +set_lcm_register(0xD410,0x01); +set_lcm_register(0xD411,0x36); +set_lcm_register(0xD412,0x01); +set_lcm_register(0xD413,0x73); +set_lcm_register(0xD414,0x01); +set_lcm_register(0xD415,0x9F); +set_lcm_register(0xD416,0x01); +set_lcm_register(0xD417,0xDF); +set_lcm_register(0xD418,0x02); +set_lcm_register(0xD419,0x10); +set_lcm_register(0xD41A,0x02); +set_lcm_register(0xD41B,0x11); +set_lcm_register(0xD41C,0x02); +set_lcm_register(0xD41D,0x3D); +set_lcm_register(0xD41E,0x02); +set_lcm_register(0xD41F,0x69); +set_lcm_register(0xD420,0x02); +set_lcm_register(0xD421,0x81); +set_lcm_register(0xD422,0x02); +set_lcm_register(0xD423,0x9D); +set_lcm_register(0xD424,0x02); +set_lcm_register(0xD425,0xAD); +set_lcm_register(0xD426,0x02); +set_lcm_register(0xD427,0xC3); +set_lcm_register(0xD428,0x02); +set_lcm_register(0xD429,0xD0); +set_lcm_register(0xD42A,0x02); +set_lcm_register(0xD42B,0xE2); +set_lcm_register(0xD42C,0x02); +set_lcm_register(0xD42D,0xEE); +set_lcm_register(0xD42E,0x03); +set_lcm_register(0xD42F,0x01); +set_lcm_register(0xD430,0x03); +set_lcm_register(0xD431,0x26); +set_lcm_register(0xD432,0x03); +set_lcm_register(0xD433,0x8E); +set_lcm_register(0xD500,0x00); +set_lcm_register(0xD501,0x32); +set_lcm_register(0xD502,0x00); +set_lcm_register(0xD503,0x33); +set_lcm_register(0xD504,0x00); +set_lcm_register(0xD505,0x41); +set_lcm_register(0xD506,0x00); +set_lcm_register(0xD507,0x5A); +set_lcm_register(0xD508,0x00); +set_lcm_register(0xD509,0x76); +set_lcm_register(0xD50A,0x00); +set_lcm_register(0xD50B,0xA7); +set_lcm_register(0xD50C,0x00); +set_lcm_register(0xD50D,0xCF); +set_lcm_register(0xD50E,0x01); +set_lcm_register(0xD50F,0x09); +set_lcm_register(0xD510,0x01); +set_lcm_register(0xD511,0x36); +set_lcm_register(0xD512,0x01); +set_lcm_register(0xD513,0x73); +set_lcm_register(0xD514,0x01); +set_lcm_register(0xD515,0x9F); +set_lcm_register(0xD516,0x01); +set_lcm_register(0xD517,0xDF); +set_lcm_register(0xD518,0x02); +set_lcm_register(0xD519,0x10); +set_lcm_register(0xD51A,0x02); +set_lcm_register(0xD51B,0x11); +set_lcm_register(0xD51C,0x02); +set_lcm_register(0xD51D,0x3D); +set_lcm_register(0xD51E,0x02); +set_lcm_register(0xD51F,0x69); +set_lcm_register(0xD520,0x02); +set_lcm_register(0xD521,0x81); +set_lcm_register(0xD522,0x02); +set_lcm_register(0xD523,0x9D); +set_lcm_register(0xD524,0x02); +set_lcm_register(0xD525,0xAD); +set_lcm_register(0xD526,0x02); +set_lcm_register(0xD527,0xC3); +set_lcm_register(0xD528,0x02); +set_lcm_register(0xD529,0xD0); +set_lcm_register(0xD52A,0x02); +set_lcm_register(0xD52B,0xE2); +set_lcm_register(0xD52C,0x02); +set_lcm_register(0xD52D,0xEE); +set_lcm_register(0xD52E,0x03); +set_lcm_register(0xD52F,0x01); +set_lcm_register(0xD530,0x03); +set_lcm_register(0xD531,0x26); +set_lcm_register(0xD532,0x03); +set_lcm_register(0xD533,0x8E); +set_lcm_register(0xD600,0x00); +set_lcm_register(0xD601,0x32); +set_lcm_register(0xD602,0x00); +set_lcm_register(0xD603,0x33); +set_lcm_register(0xD604,0x00); +set_lcm_register(0xD605,0x41); +set_lcm_register(0xD606,0x00); +set_lcm_register(0xD607,0x5A); +set_lcm_register(0xD608,0x00); +set_lcm_register(0xD609,0x76); +set_lcm_register(0xD60A,0x00); +set_lcm_register(0xD60B,0xA7); +set_lcm_register(0xD60C,0x00); +set_lcm_register(0xD60D,0xCF); +set_lcm_register(0xD60E,0x01); +set_lcm_register(0xD60F,0x09); +set_lcm_register(0xD610,0x01); +set_lcm_register(0xD611,0x36); +set_lcm_register(0xD612,0x01); +set_lcm_register(0xD613,0x73); +set_lcm_register(0xD614,0x01); +set_lcm_register(0xD615,0x9F); +set_lcm_register(0xD616,0x01); +set_lcm_register(0xD617,0xDF); +set_lcm_register(0xD618,0x02); +set_lcm_register(0xD619,0x10); +set_lcm_register(0xD61A,0x02); +set_lcm_register(0xD61B,0x11); +set_lcm_register(0xD61C,0x02); +set_lcm_register(0xD61D,0x3D); +set_lcm_register(0xD61E,0x02); +set_lcm_register(0xD61F,0x69); +set_lcm_register(0xD620,0x02); +set_lcm_register(0xD621,0x81); +set_lcm_register(0xD622,0x02); +set_lcm_register(0xD623,0x9D); +set_lcm_register(0xD624,0x02); +set_lcm_register(0xD625,0xAD); +set_lcm_register(0xD626,0x02); +set_lcm_register(0xD627,0xC3); +set_lcm_register(0xD628,0x02); +set_lcm_register(0xD629,0xD0); +set_lcm_register(0xD62A,0x02); +set_lcm_register(0xD62B,0xE2); +set_lcm_register(0xD62C,0x02); +set_lcm_register(0xD62D,0xEE); +set_lcm_register(0xD62E,0x03); +set_lcm_register(0xD62F,0x01); +set_lcm_register(0xD630,0x03); +set_lcm_register(0xD631,0x26); +set_lcm_register(0xD632,0x03); +set_lcm_register(0xD633,0x8E); + + +//LV2 Page 0 enable +set_lcm_register(0xF000,0x55); +set_lcm_register(0xF001,0xAA); +set_lcm_register(0xF002,0x52); +set_lcm_register(0xF003,0x08); +set_lcm_register(0xF004,0x00); + +//480x800 +set_lcm_register(0xB500, 0x50); + +//Display control +set_lcm_register(0xB100, 0xCC); +set_lcm_register(0xB101, 0x00); + +//Source hold time +set_lcm_register(0xB600,0x05); + +//Gate EQ control +set_lcm_register(0xB700,0x70); +set_lcm_register(0xB701,0x70); + +//Source EQ control (Mode 2) +set_lcm_register(0xB800,0x01); +set_lcm_register(0xB801,0x03); +set_lcm_register(0xB802,0x03); +set_lcm_register(0xB803,0x03); + +//Inversion mode (2-dot) +set_lcm_register(0xBC00,0x02); +set_lcm_register(0xBC01,0x00); +set_lcm_register(0xBC02,0x00); + +//Frame rate +set_lcm_register(0xBD00,0x01); +set_lcm_register(0xBD01,0x84); +set_lcm_register(0xBD02,0x1C); +set_lcm_register(0xBD03,0x1C); +set_lcm_register(0xBD04,0x00); + +//Timing control 4H w/ 4-delay +set_lcm_register(0xC900,0xD0); +set_lcm_register(0xC901,0x02); +set_lcm_register(0xC902,0x50); +set_lcm_register(0xC903,0x50); +set_lcm_register(0xC904,0x50); +set_lcm_register(0x3600,0x00); +set_lcm_register(0x3500,0x00); + +send_ctrl_cmd(0x1100); +MDELAY(120); +send_ctrl_cmd(0x2900); + +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + //lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + //lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0);//input + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, 0); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 22; + params->dpi.hsync_back_porch = 12; + params->dpi.hsync_front_porch = 16; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 33; + params->dpi.vsync_front_porch = 12; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(150); + send_ctrl_cmd(0x2900); + MDELAY(100); +} +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); + + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_read_data(); //spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_read_data(); //spi_read_data(); + + id = (id1<<8)|id2; + + + return (LCM_ID == id)?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER srl5002hn_wvga_nt35510_lcm_drv = +{ + + .name = "srl5002hn_wvga_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; + diff --git a/acer_e350_simcom75/lcm/ta7601/ta7601.c b/acer_e350_simcom75/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..8bbdeb9 --- /dev/null +++ b/acer_e350_simcom75/lcm/ta7601/ta7601.c @@ -0,0 +1,353 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/acer_e350_simcom75/lcm/tft1p3037/tft1p3037.c b/acer_e350_simcom75/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..1177e37 --- /dev/null +++ b/acer_e350_simcom75/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,384 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/acer_e350_simcom75/lcm/tft3p2380_wvga_nt35510/tft3p2380_wvga_nt35510.c b/acer_e350_simcom75/lcm/tft3p2380_wvga_nt35510/tft3p2380_wvga_nt35510.c new file mode 100644 index 0000000..e56a140 --- /dev/null +++ b/acer_e350_simcom75/lcm/tft3p2380_wvga_nt35510/tft3p2380_wvga_nt35510.c @@ -0,0 +1,2857 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +//chenhaojun +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID 0x5510 +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define SET_LA0_INPUT SET_GPIO_INPUT(LSA0_GPIO_PIN) +#define SET_LA0_OUTPUT SET_GPIO_OUTPUT(LSA0_GPIO_PIN) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline unsigned char spi_read_data(void) +{ + unsigned int i; + int k=0; + unsigned int getbyte1=0; + unsigned int data=0; + +#ifdef BUILD_UBOOT + printf("spi_read_data \r\n"); +#endif + + data = 0xc0; + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + SET_LA0_INPUT; + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 7)) + { + SET_LSDA_HIGH; + } + else + { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } +#if 0 + for(i=8;i>0;i--) + { + SET_LSCK_LOW; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#endif + UDELAY(5); + for (k = 7; k >=0; k--) + { + SET_LSCK_LOW; + if (GET_LSA0_BIT) + { + getbyte1 |= (1 << k); + } + + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + } +#ifdef BUILD_UBOOT + printf("getbyte1=0x%x \r\n",getbyte1); +#endif + SET_LSDA_HIGH; + SET_LSCE_HIGH; + return getbyte1; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + + +static void init_lcm_registers(void) +{ +#ifdef BUILD_UBOOT + printf("init_lcm_registers\r\n"); +#else + printk("init_lcm_registers\r\n"); +#endif +#ifdef AOKESI_CHAOSHENG_LCM +/********************************************** +module factory:chaosheng +module id:GWMTF10160A(R) +resolution:480*800(WVGA)-4.0inch +**********************************************/ + //********Sleep out**************** + send_ctrl_cmd(0XFF00); //TEST Commands + send_data_cmd(0XAA); + send_ctrl_cmd(0XFF01); + send_data_cmd(0X55); + send_ctrl_cmd(0XFF02); + send_data_cmd(0X25); + send_ctrl_cmd(0XFF03); + send_data_cmd(0X01); + + send_ctrl_cmd(0XF300);//TEST Commands + send_data_cmd(0X00); + send_ctrl_cmd(0XF301); + send_data_cmd(0X32); + send_ctrl_cmd(0XF302); + send_data_cmd(0X00); + send_ctrl_cmd(0XF303); + send_data_cmd(0X38); + send_ctrl_cmd(0XF304); + send_data_cmd(0X31); + send_ctrl_cmd(0XF305); + send_data_cmd(0X08); + send_ctrl_cmd(0XF306); + send_data_cmd(0X11); + send_ctrl_cmd(0XF307); + send_data_cmd(0X00); + + //set page 0 + + send_ctrl_cmd(0XF000);//Select Command Page “0” + send_data_cmd(0X55); + send_ctrl_cmd(0XF001); + send_data_cmd(0XAA); + send_ctrl_cmd(0XF002); + send_data_cmd(0X52); + send_ctrl_cmd(0XF003); + send_data_cmd(0X08); + send_ctrl_cmd(0XF004); + send_data_cmd(0X00); + + send_ctrl_cmd(0XB000);//RGB Interface Signals Control? + send_data_cmd(0X00); + send_ctrl_cmd(0XB001); + send_data_cmd(0X05); + send_ctrl_cmd(0XB002); + send_data_cmd(0X02); + send_ctrl_cmd(0XB003); + send_data_cmd(0X05); + send_ctrl_cmd(0XB004); + send_data_cmd(0X02); + + send_ctrl_cmd(0XB100);//Display Option Control + send_data_cmd(0XCC); + send_ctrl_cmd(0XB101); + send_data_cmd(0X04); + + send_ctrl_cmd(0X3600);//Memory data access control + send_data_cmd(0X12); + + send_ctrl_cmd(0XB300);//Display Clock in RGB Interface + send_data_cmd(0X00); + + send_ctrl_cmd(0XB600);//Source Output Data Hold Time Control + send_data_cmd(0X03); + + send_ctrl_cmd(0XB700);//EQ Control Function for Gate Signals + send_data_cmd(0X70); + send_ctrl_cmd(0XB701);//EQ Control Function for Gate Signals + send_data_cmd(0X70); + + send_ctrl_cmd(0XB800);//EQ Control Function for Source Driver + send_data_cmd(0X00); + send_ctrl_cmd(0XB801);// + send_data_cmd(0X06); + send_ctrl_cmd(0XB802);// + send_data_cmd(0X06); + send_ctrl_cmd(0XB805);// + send_data_cmd(0X06); + + send_ctrl_cmd(0XBC00);//Inversion Driving Control + send_data_cmd(0X00); + send_ctrl_cmd(0XBC01); + send_data_cmd(0X00);//0Xc8 + send_ctrl_cmd(0XBC02); + send_data_cmd(0X00); + + send_ctrl_cmd(0XBD00);//Display Timing Control + send_data_cmd(0X01); + send_ctrl_cmd(0XBD01); + send_data_cmd(0X84); + send_ctrl_cmd(0XBD02); + send_data_cmd(0X06); + send_ctrl_cmd(0XBD03); + send_data_cmd(0X50); + send_ctrl_cmd(0XBD04); + send_data_cmd(0X00); + + send_ctrl_cmd(0Xcc00);//Display Timing Control (Gateless) + send_data_cmd(0X03); + send_ctrl_cmd(0Xcc01); + send_data_cmd(0X01); + send_ctrl_cmd(0Xcc02); + send_data_cmd(0X06); + + //set page1 + + send_ctrl_cmd(0XF000);//Select Command Page “1” + send_data_cmd(0X55); + send_ctrl_cmd(0XF001); + send_data_cmd(0XAA); + send_ctrl_cmd(0XF002); + send_data_cmd(0X52); + send_ctrl_cmd(0XF003); + send_data_cmd(0X08); + send_ctrl_cmd(0XF004); + send_data_cmd(0X01); + + send_ctrl_cmd(0XB000);//Setting AVDD Voltage + send_data_cmd(0X05); + send_ctrl_cmd(0XB001); + send_data_cmd(0X05); + send_ctrl_cmd(0XB002); + send_data_cmd(0X05); + + send_ctrl_cmd(0XB100);//Setting AVee Voltage + send_data_cmd(0X05); + send_ctrl_cmd(0XB101); + send_data_cmd(0X05); + send_ctrl_cmd(0XB102); + send_data_cmd(0X05); + + send_ctrl_cmd(0XB200);//Setting lvgl Voltage + send_data_cmd(0X03); + send_ctrl_cmd(0XB201); + send_data_cmd(0X03); + send_ctrl_cmd(0XB202); + send_data_cmd(0X03); + + send_ctrl_cmd(0XB800);//Setting vcl Voltage + send_data_cmd(0X25); + send_ctrl_cmd(0XB801); + send_data_cmd(0X25); + send_ctrl_cmd(0XB802); + send_data_cmd(0X25); + + send_ctrl_cmd(0XB300);//Setting vgh Voltage + send_data_cmd(0X0b); + send_ctrl_cmd(0XB301); + send_data_cmd(0X0b); + send_ctrl_cmd(0XB302); + send_data_cmd(0X0b); + + send_ctrl_cmd(0XB900);//Setting vgh Voltage + send_data_cmd(0X34); + send_ctrl_cmd(0XB901); + send_data_cmd(0X34); + send_ctrl_cmd(0XB902); + send_data_cmd(0X34); + + send_ctrl_cmd(0XBF00);//VGH Output Voltage + send_data_cmd(0X01); + + send_ctrl_cmd(0XB500);//Setting VGL_REG Voltage + send_data_cmd(0X08); + send_ctrl_cmd(0XB501); + send_data_cmd(0X08); + send_ctrl_cmd(0XB502); + send_data_cmd(0X08); + + send_ctrl_cmd(0XBA00);//Power Control for VGLX + send_data_cmd(0X24); + send_ctrl_cmd(0XBA01); + send_data_cmd(0X24); + send_ctrl_cmd(0XBA02); + send_data_cmd(0X24); + + send_ctrl_cmd(0XB400);//Setting VRGH Voltage + send_data_cmd(0X2D); + send_ctrl_cmd(0XB401); + send_data_cmd(0X2D); + send_ctrl_cmd(0XB402); + send_data_cmd(0X2D); + + send_ctrl_cmd(0XBC00);//Setting VGMP and VGSP Voltage + send_data_cmd(0X00); + send_ctrl_cmd(0XBC01); + send_data_cmd(0X68); + send_ctrl_cmd(0XBC02); + send_data_cmd(0X00); + + send_ctrl_cmd(0XBD00);//Setting VGMN and VGSN Voltage + send_data_cmd(0X00); + send_ctrl_cmd(0XBD01); + send_data_cmd(0X7C); + send_ctrl_cmd(0XBD02); + send_data_cmd(0X00); + + send_ctrl_cmd(0XBE00);//Setting VCOM Offset Voltage + send_data_cmd(0X00); + send_ctrl_cmd(0XBE01); + send_data_cmd(0X40); + + //set page1 + + send_ctrl_cmd(0XF000);//Select Command Page “1” + send_data_cmd(0X55); + send_ctrl_cmd(0XF001); + send_data_cmd(0XAA); + send_ctrl_cmd(0XF002); + send_data_cmd(0X52); + send_ctrl_cmd(0XF003); + send_data_cmd(0X01); + //send_ctrl_cmd(0XF004); + //send_data_cmd(0X01); + + send_ctrl_cmd(0XD000);//Gradient Control for Gamma Voltage + send_data_cmd(0X0B); + send_ctrl_cmd(0XD001); + send_data_cmd(0X14); + send_ctrl_cmd(0XD002); + send_data_cmd(0X0C); + send_ctrl_cmd(0XD003); + send_data_cmd(0X0E); + + //GAMMA RED + send_ctrl_cmd(0XD100); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD101); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD102); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD103); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD104); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD105); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD106); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD107); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD108); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD109); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD10a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD10b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD10c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD10d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD10e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD10f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD110); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD111); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD112); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD113); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD114); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD115); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD116); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD117); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD118); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD119); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD11a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD11b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD11c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD11d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD11e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD11f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD120); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD121); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD122); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD123); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD124); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD125); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD126); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD127); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD128); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD129); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD12a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD12b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD12c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD12d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD12e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD12f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD130); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD131); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD132); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD133); + send_data_cmd(0XF1); + + //Positive Gamma for GREEN + send_ctrl_cmd(0XD200); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD201); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD202); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD203); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD204); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD205); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD206); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD207); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD208); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD209); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD20a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD20b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD20c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD20d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD20e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD20f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD210); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD211); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD212); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD213); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD214); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD215); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD216); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD217); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD218); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD219); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD21a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD21b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD21c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD21d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD21e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD21f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD220); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD221); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD222); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD223); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD224); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD225); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD226); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD227); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD228); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD229); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD22a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD22b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD22c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD22d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD22e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD22f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD230); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD231); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD232); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD233); + send_data_cmd(0XF1); + + //Positive Gamma for BLUE + send_ctrl_cmd(0XD300); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD301); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD302); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD303); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD304); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD305); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD306); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD307); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD308); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD309); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD30a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD30b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD30c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD30d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD30e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD30f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD310); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD311); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD312); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD313); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD314); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD315); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD316); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD317); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD318); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD319); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD31a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD31b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD31c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD31d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD31e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD31f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD320); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD321); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD322); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD323); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD324); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD325); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD326); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD327); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD328); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD329); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD32a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD32b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD32c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD32d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD32e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD32f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD330); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD331); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD332); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD333); + send_data_cmd(0XF1); + + //Negative Gamma for RED + send_ctrl_cmd(0XD400); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD401); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD402); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD403); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD404); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD405); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD406); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD407); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD408); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD409); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD40a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD40b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD40c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD40d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD40e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD40f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD410); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD411); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD412); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD413); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD414); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD415); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD416); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD417); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD418); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD419); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD41a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD41b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD41c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD41d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD41e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD41f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD420); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD421); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD422); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD423); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD424); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD425); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD426); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD427); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD428); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD429); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD42a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD42b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD42c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD42d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD42e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD42f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD430); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD431); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD432); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD433); + send_data_cmd(0XF1); + + //Negative Gamma for GREEN + send_ctrl_cmd(0XD500); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD501); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD502); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD503); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD504); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD505); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD506); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD507); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD508); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD509); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD50a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD50b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD50c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD50d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD50e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD50f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD510); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD511); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD512); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD513); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD514); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD515); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD516); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD517); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD518); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD519); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD51a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD51b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD51c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD51d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD51e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD51f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD520); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD521); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD522); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD523); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD524); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD525); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD526); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD527); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD528); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD529); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD52a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD52b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD52c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD52d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD52e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD52f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD530); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD531); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD532); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD533); + send_data_cmd(0XF1); + //Negative Gamma for BLUE + send_ctrl_cmd(0XD600); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD601); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD602); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD603); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD604); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD605); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD606); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD607); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD608); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD609); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD60a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD60b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD60c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD60d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD60e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD60f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD610); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD611); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD612); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD613); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD614); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD615); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD616); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD617); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD618); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD619); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD61a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD61b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD61c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD61d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD61e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD61f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD620); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD621); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD622); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD623); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD624); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD625); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD626); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD627); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD628); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD629); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD62a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD62b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD62c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD62d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD62e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD62f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD630); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD631); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD632); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD633); + send_data_cmd(0XF1); + + send_ctrl_cmd(0X3a00); + send_data_cmd(0X77);// 0X55 //0x77->24bit + + // enable tering free + send_ctrl_cmd(0X3500); + send_data_cmd(0X00); + + //send_ctrl_cmd(0X3600); + //send_data_cmd(0X54); +#else +/********************************************** +module factory:sunrise +module id:SRL-WVGA-4009DN (V5.0) +resolution:480*800(WVGA)-4.0inch +**********************************************/ + //********Sleep out**************** + send_ctrl_cmd(0XFF00); //TEST Commands + send_data_cmd(0XAA); + send_ctrl_cmd(0XFF01); + send_data_cmd(0X55); + send_ctrl_cmd(0XFF02); + send_data_cmd(0X25); + send_ctrl_cmd(0XFF03); + send_data_cmd(0X01); + + send_ctrl_cmd(0XF300);//TEST Commands + send_data_cmd(0X00); + send_ctrl_cmd(0XF301); + send_data_cmd(0X32); + send_ctrl_cmd(0XF302); + send_data_cmd(0X00); + send_ctrl_cmd(0XF303); + send_data_cmd(0X38); + send_ctrl_cmd(0XF304); + send_data_cmd(0X31); + send_ctrl_cmd(0XF305); + send_data_cmd(0X08); + send_ctrl_cmd(0XF306); + send_data_cmd(0X11); + send_ctrl_cmd(0XF307); + send_data_cmd(0X00); + + //set page 0 + + send_ctrl_cmd(0XF000);//Select Command Page “0” + send_data_cmd(0X55); + send_ctrl_cmd(0XF001); + send_data_cmd(0XAA); + send_ctrl_cmd(0XF002); + send_data_cmd(0X52); + send_ctrl_cmd(0XF003); + send_data_cmd(0X08); + send_ctrl_cmd(0XF004); + send_data_cmd(0X00); + + send_ctrl_cmd(0XB000);//RGB Interface Signals Control? + send_data_cmd(0X00); + send_ctrl_cmd(0XB001); + send_data_cmd(0X05); + send_ctrl_cmd(0XB002); + send_data_cmd(0X02); + send_ctrl_cmd(0XB003); + send_data_cmd(0X05); + send_ctrl_cmd(0XB004); + send_data_cmd(0X02); + + send_ctrl_cmd(0XB100);//Display Option Control + send_data_cmd(0XCC); + send_ctrl_cmd(0XB101); + send_data_cmd(0X04); + + send_ctrl_cmd(0X3600);//Memory data access control + send_data_cmd(0X11); + + send_ctrl_cmd(0XB300);//Display Clock in RGB Interface + send_data_cmd(0X00); + + send_ctrl_cmd(0XB600);//Source Output Data Hold Time Control + send_data_cmd(0X03); + + send_ctrl_cmd(0XB700);//EQ Control Function for Gate Signals + send_data_cmd(0X70); + send_ctrl_cmd(0XB701);//EQ Control Function for Gate Signals + send_data_cmd(0X70); + + send_ctrl_cmd(0XB800);//EQ Control Function for Source Driver + send_data_cmd(0X00); + send_ctrl_cmd(0XB801);// + send_data_cmd(0X06); + send_ctrl_cmd(0XB802);// + send_data_cmd(0X06); + send_ctrl_cmd(0XB805);// + send_data_cmd(0X06); + + send_ctrl_cmd(0XBC00);//Inversion Driving Control + send_data_cmd(0X00); + send_ctrl_cmd(0XBC01); + send_data_cmd(0X00);//0Xc8 + send_ctrl_cmd(0XBC02); + send_data_cmd(0X00); + + send_ctrl_cmd(0XBD00);//Display Timing Control + send_data_cmd(0X01); + send_ctrl_cmd(0XBD01); + send_data_cmd(0X84); + send_ctrl_cmd(0XBD02); + send_data_cmd(0X06); + send_ctrl_cmd(0XBD03); + send_data_cmd(0X50); + send_ctrl_cmd(0XBD04); + send_data_cmd(0X00); + + send_ctrl_cmd(0Xcc00);//Display Timing Control (Gateless) + send_data_cmd(0X03); + send_ctrl_cmd(0Xcc01); + send_data_cmd(0X01); + send_ctrl_cmd(0Xcc02); + send_data_cmd(0X06); + + //set page1 + + send_ctrl_cmd(0XF000);//Select Command Page “1” + send_data_cmd(0X55); + send_ctrl_cmd(0XF001); + send_data_cmd(0XAA); + send_ctrl_cmd(0XF002); + send_data_cmd(0X52); + send_ctrl_cmd(0XF003); + send_data_cmd(0X08); + send_ctrl_cmd(0XF004); + send_data_cmd(0X01); + + send_ctrl_cmd(0XB000);//Setting AVDD Voltage + send_data_cmd(0X05); + send_ctrl_cmd(0XB001); + send_data_cmd(0X05); + send_ctrl_cmd(0XB002); + send_data_cmd(0X05); + + send_ctrl_cmd(0XB100);//Setting AVee Voltage + send_data_cmd(0X05); + send_ctrl_cmd(0XB101); + send_data_cmd(0X05); + send_ctrl_cmd(0XB102); + send_data_cmd(0X05); + + send_ctrl_cmd(0XB200);//Setting lvgl Voltage + send_data_cmd(0X03); + send_ctrl_cmd(0XB201); + send_data_cmd(0X03); + send_ctrl_cmd(0XB202); + send_data_cmd(0X03); + + send_ctrl_cmd(0XB800);//Setting vcl Voltage + send_data_cmd(0X25); + send_ctrl_cmd(0XB801); + send_data_cmd(0X25); + send_ctrl_cmd(0XB802); + send_data_cmd(0X25); + + send_ctrl_cmd(0XB300);//Setting vgh Voltage + send_data_cmd(0X0b); + send_ctrl_cmd(0XB301); + send_data_cmd(0X0b); + send_ctrl_cmd(0XB302); + send_data_cmd(0X0b); + + send_ctrl_cmd(0XB900);//Setting vgh Voltage + send_data_cmd(0X34); + send_ctrl_cmd(0XB901); + send_data_cmd(0X34); + send_ctrl_cmd(0XB902); + send_data_cmd(0X34); + + send_ctrl_cmd(0XBF00);//VGH Output Voltage + send_data_cmd(0X01); + + send_ctrl_cmd(0XB500);//Setting VGL_REG Voltage + send_data_cmd(0X08); + send_ctrl_cmd(0XB501); + send_data_cmd(0X08); + send_ctrl_cmd(0XB502); + send_data_cmd(0X08); + + send_ctrl_cmd(0XBA00);//Power Control for VGLX + send_data_cmd(0X24); + send_ctrl_cmd(0XBA01); + send_data_cmd(0X24); + send_ctrl_cmd(0XBA02); + send_data_cmd(0X24); + + send_ctrl_cmd(0XB400);//Setting VRGH Voltage + send_data_cmd(0X2D); + send_ctrl_cmd(0XB401); + send_data_cmd(0X2D); + send_ctrl_cmd(0XB402); + send_data_cmd(0X2D); + + send_ctrl_cmd(0XBC00);//Setting VGMP and VGSP Voltage + send_data_cmd(0X00); + send_ctrl_cmd(0XBC01); + send_data_cmd(0X68); + send_ctrl_cmd(0XBC02); + send_data_cmd(0X00); + + send_ctrl_cmd(0XBD00);//Setting VGMN and VGSN Voltage + send_data_cmd(0X00); + send_ctrl_cmd(0XBD01); + send_data_cmd(0X7C); + send_ctrl_cmd(0XBD02); + send_data_cmd(0X00); + + send_ctrl_cmd(0XBE00);//Setting VCOM Offset Voltage + send_data_cmd(0X00); + send_ctrl_cmd(0XBE01); + send_data_cmd(0X40); + + //set page1 + + send_ctrl_cmd(0XF000);//Select Command Page “1” + send_data_cmd(0X55); + send_ctrl_cmd(0XF001); + send_data_cmd(0XAA); + send_ctrl_cmd(0XF002); + send_data_cmd(0X52); + send_ctrl_cmd(0XF003); + send_data_cmd(0X01); + //send_ctrl_cmd(0XF004); + //send_data_cmd(0X01); + + send_ctrl_cmd(0XD000);//Gradient Control for Gamma Voltage + send_data_cmd(0X0B); + send_ctrl_cmd(0XD001); + send_data_cmd(0X14); + send_ctrl_cmd(0XD002); + send_data_cmd(0X0C); + send_ctrl_cmd(0XD003); + send_data_cmd(0X0E); + + //GAMMA RED + send_ctrl_cmd(0XD100); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD101); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD102); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD103); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD104); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD105); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD106); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD107); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD108); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD109); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD10a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD10b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD10c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD10d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD10e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD10f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD110); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD111); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD112); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD113); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD114); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD115); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD116); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD117); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD118); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD119); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD11a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD11b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD11c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD11d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD11e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD11f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD120); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD121); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD122); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD123); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD124); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD125); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD126); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD127); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD128); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD129); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD12a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD12b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD12c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD12d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD12e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD12f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD130); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD131); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD132); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD133); + send_data_cmd(0XF1); + + //Positive Gamma for GREEN + send_ctrl_cmd(0XD200); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD201); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD202); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD203); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD204); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD205); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD206); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD207); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD208); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD209); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD20a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD20b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD20c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD20d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD20e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD20f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD210); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD211); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD212); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD213); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD214); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD215); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD216); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD217); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD218); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD219); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD21a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD21b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD21c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD21d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD21e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD21f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD220); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD221); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD222); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD223); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD224); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD225); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD226); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD227); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD228); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD229); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD22a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD22b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD22c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD22d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD22e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD22f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD230); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD231); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD232); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD233); + send_data_cmd(0XF1); + + //Positive Gamma for BLUE + send_ctrl_cmd(0XD300); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD301); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD302); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD303); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD304); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD305); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD306); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD307); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD308); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD309); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD30a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD30b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD30c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD30d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD30e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD30f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD310); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD311); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD312); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD313); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD314); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD315); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD316); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD317); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD318); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD319); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD31a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD31b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD31c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD31d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD31e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD31f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD320); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD321); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD322); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD323); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD324); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD325); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD326); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD327); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD328); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD329); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD32a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD32b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD32c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD32d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD32e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD32f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD330); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD331); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD332); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD333); + send_data_cmd(0XF1); + + //Negative Gamma for RED + send_ctrl_cmd(0XD400); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD401); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD402); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD403); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD404); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD405); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD406); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD407); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD408); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD409); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD40a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD40b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD40c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD40d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD40e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD40f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD410); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD411); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD412); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD413); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD414); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD415); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD416); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD417); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD418); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD419); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD41a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD41b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD41c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD41d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD41e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD41f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD420); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD421); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD422); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD423); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD424); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD425); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD426); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD427); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD428); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD429); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD42a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD42b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD42c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD42d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD42e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD42f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD430); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD431); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD432); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD433); + send_data_cmd(0XF1); + + //Negative Gamma for GREEN + send_ctrl_cmd(0XD500); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD501); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD502); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD503); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD504); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD505); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD506); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD507); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD508); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD509); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD50a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD50b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD50c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD50d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD50e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD50f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD510); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD511); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD512); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD513); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD514); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD515); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD516); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD517); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD518); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD519); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD51a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD51b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD51c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD51d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD51e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD51f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD520); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD521); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD522); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD523); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD524); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD525); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD526); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD527); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD528); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD529); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD52a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD52b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD52c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD52d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD52e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD52f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD530); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD531); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD532); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD533); + send_data_cmd(0XF1); + //Negative Gamma for BLUE + send_ctrl_cmd(0XD600); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD601); + send_data_cmd(0X37); + + send_ctrl_cmd(0XD602); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD603); + send_data_cmd(0X61); + + send_ctrl_cmd(0XD604); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD605); + send_data_cmd(0X92); + + send_ctrl_cmd(0XD606); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD607); + send_data_cmd(0XB4); + + send_ctrl_cmd(0XD608); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD609); + send_data_cmd(0XCF); + + send_ctrl_cmd(0XD60a); + send_data_cmd(0X00); + + send_ctrl_cmd(0XD60b); + send_data_cmd(0XF6); + + send_ctrl_cmd(0XD60c); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD60d); + send_data_cmd(0X2F); + + send_ctrl_cmd(0XD60e); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD60f); + send_data_cmd(0X7F); + + send_ctrl_cmd(0XD610); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD611); + send_data_cmd(0X97); + + send_ctrl_cmd(0XD612); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD613); + send_data_cmd(0XC0); + + send_ctrl_cmd(0XD614); + send_data_cmd(0X01); + + send_ctrl_cmd(0XD615); + send_data_cmd(0XE5); + + send_ctrl_cmd(0XD616); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD617); + send_data_cmd(0X1F); + + send_ctrl_cmd(0XD618); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD619); + send_data_cmd(0X50); + + send_ctrl_cmd(0XD61a); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD61b); + send_data_cmd(0X52); + + send_ctrl_cmd(0XD61c); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD61d); + send_data_cmd(0X87); + + send_ctrl_cmd(0XD61e); + send_data_cmd(0X02); + + + send_ctrl_cmd(0XD61f); + send_data_cmd(0XBE); + + send_ctrl_cmd(0XD620); + send_data_cmd(0X02); + + send_ctrl_cmd(0XD621); + send_data_cmd(0XE2); + + send_ctrl_cmd(0XD622); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD623); + send_data_cmd(0X0F); + + send_ctrl_cmd(0XD624); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD625); + send_data_cmd(0X30); + + send_ctrl_cmd(0XD626); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD627); + send_data_cmd(0X5C); + + send_ctrl_cmd(0XD628); + send_data_cmd(0X03); + + + send_ctrl_cmd(0XD629); + send_data_cmd(0X77); + + send_ctrl_cmd(0XD62a); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD62b); + send_data_cmd(0X94); + + send_ctrl_cmd(0XD62c); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD62d); + send_data_cmd(0X9F); + + + + send_ctrl_cmd(0XD62e); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD62f); + send_data_cmd(0XAC); + + send_ctrl_cmd(0XD630); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD631); + send_data_cmd(0XBA); + + send_ctrl_cmd(0XD632); + send_data_cmd(0X03); + + send_ctrl_cmd(0XD633); + send_data_cmd(0XF1); + + send_ctrl_cmd(0X3a00); + send_data_cmd(0X77);// 0X55 //0x77->24bit + + // enable tering free + send_ctrl_cmd(0X3500); + send_data_cmd(0X00); + + //send_ctrl_cmd(0X3600); + //send_data_cmd(0X54); +#endif +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 40; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 12; + params->dpi.hsync_back_porch = 8; + params->dpi.hsync_front_porch = 8; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 8; + params->dpi.vsync_front_porch = 8; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + +#ifdef BUILD_UBOOT + printf("lcm_init\r\n"); +#else + printk("lcm_init\r\n"); +#endif + + config_gpio(); + + SET_RESET_PIN(1);//LK@I3000 + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120);//LK@0314,at least 120ms + + init_lcm_registers(); + +} + + +static void lcm_suspend(void) +{ + + + send_ctrl_cmd(0X2800); // + MDELAY(150); + send_ctrl_cmd(0x1000); + MDELAY(150); + +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0X1100); // + MDELAY(150); + send_ctrl_cmd(0X2900); // + MDELAY(150); + + + +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id1 = 0; + unsigned int id2 = 0; + unsigned int id = 0; + #if 1 + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120);//LK@0314,at least 120ms + #endif + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + send_ctrl_cmd(0xc500); + id1 = spi_read_data(); + MDELAY(20); + send_ctrl_cmd(0xc501); + id2 = spi_read_data(); + + id = (id1<<8)|id2; + +#ifdef BUILD_UBOOT + printf("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#else + printk("lcd_id1=0x%x,lcd_id2=0x%x,lcd_id=0x%x \r\n",id1,id2,id); +#endif + + return (LCM_ID == id)?1:0; + +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft3p2380_nt35510_lcm_drv = +{ + .name = "tft3p2380_nt35510", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id +}; + + + diff --git a/acer_e350_simcom75/lcm/tft3p2710_fwvga_otm8018b/tft3p2710_fwvga_otm8018b.c b/acer_e350_simcom75/lcm/tft3p2710_fwvga_otm8018b/tft3p2710_fwvga_otm8018b.c new file mode 100644 index 0000000..5801c0d --- /dev/null +++ b/acer_e350_simcom75/lcm/tft3p2710_fwvga_otm8018b/tft3p2710_fwvga_otm8018b.c @@ -0,0 +1,1111 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) +#define LCM_ID 0x8009 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define GET_LSA0_BIT mt_get_gpio_in(LSA0_GPIO_PIN) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#if 1 +static __inline unsigned char spi_get_byte(unsigned int reg) +{ + unsigned int i; + int k; + unsigned char getbyte=0; + + // reg = (CTRL_ID | (reg & 0xFF)); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + SET_LSCE_LOW; + UDELAY(1); + + + for (i = 0; i < 8; ++ i) + { + SET_LSCK_LOW; + if (reg & (1 << 7)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + reg <<= 1; + } + + UDELAY(2); + for (k = 7; k >= 0; k--) + { + SET_LSCK_LOW; + UDELAY(5); + SET_LSCK_HIGH; + UDELAY(5); + if (GET_LSA0_BIT) { + getbyte |= (1 << k); + } + + } + + UDELAY(2); + + SET_LSDA_HIGH; + SET_LSCE_HIGH; + + return getbyte; +} +#endif +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char high_8bit = (cmd>>8)&0x00FF; + unsigned char low_8bit = cmd&0x00FF; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); + +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char high_8bit = (data>>8)&0x00FF; + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +#if 0 + set_lcm_register(0xFF00,0x80); + set_lcm_register(0xFF01,0x09); //enable EXTC + set_lcm_register(0xFF02,0x01); + set_lcm_register(0xFF80,0x80); //enable Orise mode + set_lcm_register(0xFF81,0x09); + set_lcm_register(0xFF03,0x01); //enable SPI+I2C cmd2 read + + //gamma DC + set_lcm_register(0xC0b4,0x10); //column inversion 0x50//10 + set_lcm_register(0xC489,0x08); //reg off + set_lcm_register(0xC0a3,0x00); //pre-charge //V02 + set_lcm_register(0xC582,0xA3); //REG-pump23 + set_lcm_register(0xC590,0xd6); //Pump setting (3x=D6)-->(2x=96)//v02 01/11 0xD6 + set_lcm_register(0xC591,0x87); //Pump setting(VGH/VGL) 0x87 + set_lcm_register(0xD800,0x74); //GVDD=4.5V /73 + set_lcm_register(0xD801,0x72); //NGVDD=4.5V /71 + + //VCOMDC + set_lcm_register(0xD900,0x60); // VCOMDC= 0x5c /5c//60 + MDELAY(20); + + //Positive + set_lcm_register(0xE100,0x09); + set_lcm_register(0xE101,0x0a); + set_lcm_register(0xE102,0x0e); + set_lcm_register(0xE103,0x0d); + set_lcm_register(0xE104,0x07); + set_lcm_register(0xE105,0x18); + set_lcm_register(0xE106,0x0d); + set_lcm_register(0xE107,0x0d); + set_lcm_register(0xE108,0x01); + set_lcm_register(0xE109,0x04); + set_lcm_register(0xE10A,0x05); + set_lcm_register(0xE10B,0x06); + set_lcm_register(0xE10C,0x0e); + set_lcm_register(0xE10D,0x25); + set_lcm_register(0xE10E,0x22); + set_lcm_register(0xE10F,0x05); + + //Negative + set_lcm_register(0xE200,0x09); + set_lcm_register(0xE201,0x0a); + set_lcm_register(0xE202,0x0e); + set_lcm_register(0xE203,0x0D); + set_lcm_register(0xE204,0x07); + set_lcm_register(0xE205,0x18); + set_lcm_register(0xE206,0x0d); + set_lcm_register(0xE207,0x0d); + set_lcm_register(0xE208,0x01); + set_lcm_register(0xE209,0x04); + set_lcm_register(0xE20A,0x05); + set_lcm_register(0xE20B,0x06); + set_lcm_register(0xE20C,0x0e); + set_lcm_register(0xE20D,0x25); + set_lcm_register(0xE20E,0x22); + set_lcm_register(0xE20F,0x05); + + // + set_lcm_register(0xC181,0x66); //Frame rate 65Hz//V02 /6f + + //RGB I/F setting VSYNC for OTM8018 0x0e + set_lcm_register(0xC1a1,0x08); //external Vsync,Hsync,DE + //set_lcm_register(0xC0,0xa3,0x1b); //pre-charge //V02 + set_lcm_register(0xC481,0x83); //source bias //V02 + set_lcm_register(0xC592,0x01); //Pump45 + set_lcm_register(0xC5b1,0xa9); //DC voltage setting ;[0]GVDD output, default: 0xa8 + set_lcm_register(0xC480,0x30); //no display source output=GND / + + + // CE8x : vst1, vst2, vst3, vst4 + set_lcm_register(0xCE80,0x85); // ce81[7:0] : vst1_shift[7:0] + set_lcm_register(0xCE81,0x03); // ce82[7:0] : 0000, vst1_width[3:0] + set_lcm_register(0xCE82,0x00); // ce83[7:0] : vst1_tchop[7:0] + set_lcm_register(0xCE83,0x84); // ce84[7:0] : vst2_shift[7:0] + set_lcm_register(0xCE84,0x03); // ce85[7:0] : 0000, vst2_width[3:0] + set_lcm_register(0xCE85,0x00); // ce86[7:0] : vst2_tchop[7:0] + + set_lcm_register(0xCE86,0x83); //vst3_shift[7:0] + + set_lcm_register(0xCE87,0x03); // ce88[7:0] : 0000, vst3_width[3:0] + set_lcm_register(0xCE88,0x00); // ce89[7:0] : vst3_tchop[7:0] + + set_lcm_register(0xCE89,0x82); // ce8a[7:0] : vst4_shift[7:0] + set_lcm_register(0xCE8a,0x03); // ce8b[7:0] : 0000, vst4_width[3:0] + set_lcm_register(0xCE8b,0x00); // ce8c[7:0] : vst4_tchop[7:0] + + //CEAx : clka1, clka2 + set_lcm_register(0xCEa0,0x38); // cea1[7:0] : clka1_width[3:0], clka1_shift[11:8] + set_lcm_register(0xCEa1,0x02); // cea2[7:0] : clka1_shift[7:0] + set_lcm_register(0xCEa2,0x03); // cea3[7:0] : clka1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEa3,0x21); // cea4[7:0] : clka1_switch[7:0] + set_lcm_register(0xCEa4,0x00); // cea5[7:0] : clka1_extend[7:0] + set_lcm_register(0xCEa5,0x00); // cea6[7:0] : clka1_tchop[7:0] + set_lcm_register(0xCEa6,0x00); // cea7[7:0] : clka1_tglue[7:0] + set_lcm_register(0xCEa7,0x38); // cea8[7:0] : clka2_width[3:0], clka2_shift[11:8] + set_lcm_register(0xCEa8,0x01); // cea9[7:0] : clka2_shift[7:0] + set_lcm_register(0xCEa9,0x03); // ceaa[7:0] : clka2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEaa,0x22); // ceab[7:0] : clka2_switch[7:0] + set_lcm_register(0xCEab,0x00); // ceac[7:0] : clka2_extend + set_lcm_register(0xCEac,0x00); // cead[7:0] : clka2_tchop + set_lcm_register(0xCEad,0x00); // ceae[7:0] : clka2_tglue + + //CEBx : clka3, clka4 + set_lcm_register(0xCEb0,0x38); // ceb1[7:0] : clka3_width[3:0], clka3_shift[11:8] + set_lcm_register(0xCEb1,0x00); // ceb2[7:0] : clka3_shift[7:0] + set_lcm_register(0xCEb2,0x03); // ceb3[7:0] : clka3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEb3,0x23); // ceb4[7:0] : clka3_switch[7:0] + set_lcm_register(0xCEb4,0x00); // ceb5[7:0] : clka3_extend[7:0] + set_lcm_register(0xCEb5,0x00); // ceb6[7:0] : clka3_tchop[7:0] + set_lcm_register(0xCEb6,0x00); // ceb7[7:0] : clka3_tglue[7:0] + set_lcm_register(0xCEb7,0x30); // ceb8[7:0] : clka4_width[3:0], clka2_shift[11:8] + set_lcm_register(0xCEb8,0x00); // ceb9[7:0] : clka4_shift[7:0] + set_lcm_register(0xCEb9,0x03); // ceba[7:0] : clka4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEba,0x24); // cebb[7:0] : clka4_switch[7:0] + set_lcm_register(0xCEbb,0x00); // cebc[7:0] : clka4_extend + set_lcm_register(0xCEbc,0x00); // cebd[7:0] : clka4_tchop + set_lcm_register(0xCEbd,0x00); // cebe[7:0] : clka4_tglue + + //CECx : clkb1, clkb2 + set_lcm_register(0xCEc0,0x30); // cec1[7:0] : clkb1_width[3:0], clkb1_shift[11:8] + set_lcm_register(0xCEc1,0x01); // cec2[7:0] : clkb1_shift[7:0] + set_lcm_register(0xCEc2,0x03); // cec3[7:0] : clkb1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEc3,0x25); // cec4[7:0] : clkb1_switch[7:0] + set_lcm_register(0xCEc4,0x00); // cec5[7:0] : clkb1_extend[7:0] + set_lcm_register(0xCEc5,0x00); // cec6[7:0] : clkb1_tchop[7:0] + set_lcm_register(0xCEc6,0x00); // cec7[7:0] : clkb1_tglue[7:0] + set_lcm_register(0xCEc7,0x30); // cec8[7:0] : clkb2_width[3:0], clkb2_shift[11:8] + set_lcm_register(0xCEc8,0x02); // cec9[7:0] : clkb2_shift[7:0] + set_lcm_register(0xCEc9,0x03); // ceca[7:0] : clkb2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEca,0x26); // cecb[7:0] : clkb2_switch[7:0] + set_lcm_register(0xCEcb,0x00); // cecc[7:0] : clkb2_extend + set_lcm_register(0xCEcc,0x00); // cecd[7:0] : clkb2_tchop + set_lcm_register(0xCEcd,0x00); // cece[7:0] : clkb2_tglue + + //CEDx : clkb3, clkb4 + set_lcm_register(0xCEd0,0x30); // ced1[7:0] : clkb3_width[3:0], clkb3_shift[11:8] + set_lcm_register(0xCEd1,0x03); // ced2[7:0] : clkb3_shift[7:0] + set_lcm_register(0xCEd2,0x03); // ced3[7:0] : clkb3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEd3,0x27); // ced4[7:0] : clkb3_switch[7:0] + set_lcm_register(0xCEd4,0x00); // ced5[7:0] : clkb3_extend[7:0] + set_lcm_register(0xCEd5,0x00); // ced6[7:0] : clkb3_tchop[7:0] + set_lcm_register(0xCEd6,0x00); // ced7[7:0] : clkb3_tglue[7:0] + set_lcm_register(0xCEd7,0x30); // ced8[7:0] : clkb4_width[3:0], clkb4_shift[11:8] + set_lcm_register(0xCEd8,0x04); // ced9[7:0] : clkb4_shift[7:0] + set_lcm_register(0xCEd9,0x03); // ceda[7:0] : clkb4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEda,0x28); // cedb[7:0] : clkb4_switch[7:0] + set_lcm_register(0xCEdb,0x00); // cedc[7:0] : clkb4_extend + set_lcm_register(0xCEdc,0x00); // cedd[7:0] : clkb4_tchop + set_lcm_register(0xCEdd,0x00); // cede[7:0] : clkb4_tglue + + //CFCx : + set_lcm_register(0xCFc0,0x00); // cfc1[7:0] : eclk_normal_width[7:0] + set_lcm_register(0xCFc1,0x00); // cfc2[7:0] : eclk_partial_width[7:0] + set_lcm_register(0xCFc2,0x00); // cfc3[7:0] : all_normal_tchop[7:0] + set_lcm_register(0xCFc3,0x00); // cfc4[7:0] : all_partial_tchop[7:0] + set_lcm_register(0xCFc4,0x00); // cfc5[7:0] : eclk1_follow[3:0], eclk2_follow[3:0] + set_lcm_register(0xCFc5,0x00); // cfc6[7:0] : eclk3_follow[3:0], eclk4_follow[3:0] + set_lcm_register(0xCFc6,0x00); // cfc7[7:0] : 00, vstmask, vendmask, 00, dir1, dir2 (0=VGL, 1=VGH) + set_lcm_register(0xCFc7,0x00); // cfc8[7:0] : reg_goa_gnd_opt, reg_goa_dpgm_tail_set, reg_goa_f_gating_en, + set_lcm_register(0xCFc8,0x00); // cfc9[7:0] : duty_block[3:0], DGPM[3:0] + set_lcm_register(0xCFc9,0x00); // cfca[7:0] : reg_goa_gnd_period[7:0] + + //CFDx : + set_lcm_register(0xCFD0,0x00); // cfd1[7:0] : 0000000, reg_goa_frame_odd_high + + // cbcx + set_lcm_register(0xCBc0,0x00); //cbc1[7:0] : enmode H-byte of sig1 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc1,0x00); //cbc2[7:0] : enmode H-byte of sig2 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc2,0x00); //cbc3[7:0] : enmode H-byte of sig3 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc3,0x00); //cbc4[7:0] : enmode H-byte of sig4 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc4,0x04); //cbc5[7:0] : enmode H-byte of sig5 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc5,0x04); //cbc6[7:0] : enmode H-byte of sig6 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc6,0x04); //cbc7[7:0] : enmode H-byte of sig7 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc7,0x04); //cbc8[7:0] : enmode H-byte of sig8 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc8,0x04); //cbc9[7:0] : enmode H-byte of sig9 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc9,0x04); //cbca[7:0] : enmode H-byte of sig10 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBca,0x00); //cbcb[7:0] : enmode H-byte of sig11 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcb,0x00); //cbcc[7:0] : enmode H-byte of sig12 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcc,0x00); //cbcd[7:0] : enmode H-byte of sig13 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcd,0x00); //cbce[7:0] : enmode H-byte of sig14 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBce,0x00); //cbcf[7:0] : enmode H-byte of sig15 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cbdx : + set_lcm_register(0xCBd0,0x00); //cbd1[7:0] : enmode H-byte of sig16 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd1,0x00); //cbd2[7:0] : enmode H-byte of sig17 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd2,0x00); //cbd3[7:0] : enmode H-byte of sig18 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd3,0x00); //cbd4[7:0] : enmode H-byte of sig19 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd4,0x00); //cbd5[7:0] : enmode H-byte of sig20 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd5,0x00); //cbd6[7:0] : enmode H-byte of sig21 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd6,0x00); //cbd7[7:0] : enmode H-byte of sig22 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd7,0x00); //cbd8[7:0] : enmode H-byte of sig23 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd8,0x00); //cbd9[7:0] : enmode H-byte of sig24 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd9,0x04); //cbda[7:0] : enmode H-byte of sig25 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdA,0x04); //cbdb[7:0] : enmode H-byte of sig26 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdb,0x04); //cbdc[7:0] : enmode H-byte of sig27 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdC,0x04); //cbdd[7:0] : enmode H-byte of sig28 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdd,0x04); //cbde[7:0] : enmode H-byte of sig29 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBde,0x04); //cbdf[7:0] : enmode H-byte of sig30 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cbex + set_lcm_register(0xCBe0,0x00); //cbe1[7:0] : enmode H-byte of sig31 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe1,0x00); //cbe2[7:0] : enmode H-byte of sig32 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe2,0x00); //cbe3[7:0] : enmode H-byte of sig33 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe3,0x00); //cbe4[7:0] : enmode H-byte of sig34 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe4,0x00); //cbe5[7:0] : enmode H-byte of sig35 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe5,0x00); //cbe6[7:0] : enmode H-byte of sig36 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe6,0x00); //cbe7[7:0] : enmode H-byte of sig37 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe7,0x00); //cbe8[7:0] : enmode H-byte of sig38 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe8,0x00); //cbe9[7:0] : enmode H-byte of sig39 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe9,0x00); //cbea[7:0] : enmode H-byte of sig40 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cc8x + set_lcm_register(0xCC80,0x00); //cc81[7:0] : reg setting for signal01 selection with u2d mode + set_lcm_register(0xCC81,0x00); //cc82[7:0] : reg setting for signal02 selection with u2d mode + set_lcm_register(0xCC82,0x00); //cc83[7:0] : reg setting for signal03 selection with u2d mode + set_lcm_register(0xCC83,0x00); //cc84[7:0] : reg setting for signal04 selection with u2d mode + set_lcm_register(0xCC84,0x0C); //cc85[7:0] : reg setting for signal05 selection with u2d mode + set_lcm_register(0xCC85,0x0A); //cc86[7:0] : reg setting for signal06 selection with u2d mode + set_lcm_register(0xCC86,0x10); //cc87[7:0] : reg setting for signal07 selection with u2d mode + set_lcm_register(0xCC87,0x0E); //cc88[7:0] : reg setting for signal08 selection with u2d mode + set_lcm_register(0xCC88,0x03); //cc89[7:0] : reg setting for signal09 selection with u2d mode + set_lcm_register(0xCC89,0x04); //cc8a[7:0] : reg setting for signal10 selection with u2d mode + + // cc9x + set_lcm_register(0xCC90,0x00); //cc91[7:0] : reg setting for signal11 selection with u2d mode + set_lcm_register(0xCC91,0x00); //cc92[7:0] : reg setting for signal12 selection with u2d mode + set_lcm_register(0xCC92,0x00); //cc93[7:0] : reg setting for signal13 selection with u2d mode + set_lcm_register(0xCC93,0x00); //cc94[7:0] : reg setting for signal14 selection with u2d mode + set_lcm_register(0xCC94,0x00); //cc95[7:0] : reg setting for signal15 selection with u2d mode + set_lcm_register(0xCC95,0x00); //cc96[7:0] : reg setting for signal16 selection with u2d mode + set_lcm_register(0xCC96,0x00); //cc97[7:0] : reg setting for signal17 selection with u2d mode + set_lcm_register(0xCC97,0x00); //cc98[7:0] : reg setting for signal18 selection with u2d mode + set_lcm_register(0xCC98,0x00); //cc99[7:0] : reg setting for signal19 selection with u2d mode + set_lcm_register(0xCC99,0x00); //cc9a[7:0] : reg setting for signal20 selection with u2d mode + set_lcm_register(0xCC9a,0x00); //cc9b[7:0] : reg setting for signal21 selection with u2d mode + set_lcm_register(0xCC9b,0x00); //cc9c[7:0] : reg setting for signal22 selection with u2d mode + set_lcm_register(0xCC9c,0x00); //cc9d[7:0] : reg setting for signal23 selection with u2d mode + set_lcm_register(0xCC9d,0x00); //cc9e[7:0] : reg setting for signal24 selection with u2d mode + set_lcm_register(0xCC9e,0x0B); //cc9f[7:0] : reg setting for signal25 selection with u2d mode + + // ccax + set_lcm_register(0xCCa0,0x09); //cca1[7:0] : reg setting for signal26 selection with u2d mode + set_lcm_register(0xCCa1,0x0F); //cca2[7:0] : reg setting for signal27 selection with u2d mode + set_lcm_register(0xCCa2,0x0D); //cca3[7:0] : reg setting for signal28 selection with u2d mode + set_lcm_register(0xCCa3,0x01); //cca4[7:0] : reg setting for signal29 selection with u2d mode + set_lcm_register(0xCCa4,0x02); //cca5[7:0] : reg setting for signal20 selection with u2d mode + set_lcm_register(0xCCa5,0x00); //cca6[7:0] : reg setting for signal31 selection with u2d mode + set_lcm_register(0xCCa6,0x00); //cca7[7:0] : reg setting for signal32 selection with u2d mode + set_lcm_register(0xCCa7,0x00); //cca8[7:0] : reg setting for signal33 selection with u2d mode + set_lcm_register(0xCCa8,0x00); //cca9[7:0] : reg setting for signal34 selection with u2d mode + set_lcm_register(0xCCa9,0x00); //ccaa[7:0] : reg setting for signal35 selection with u2d mode + set_lcm_register(0xCCaa,0x00); //ccab[7:0] : reg setting for signal36 selection with u2d mode + set_lcm_register(0xCCab,0x00); //ccac[7:0] : reg setting for signal37 selection with u2d mode + set_lcm_register(0xCCac,0x00); //ccad[7:0] : reg setting for signal38 selection with u2d mode + set_lcm_register(0xCCad,0x00); //ccae[7:0] : reg setting for signal39 selection with u2d mode + set_lcm_register(0xCCae,0x00); //ccaf[7:0] : reg setting for signal40 selection with u2d mode + + // ccbx + set_lcm_register(0xCCb0,0x00); //ccb1[7:0] : reg setting for signal01 selection with d2u mode + set_lcm_register(0xCCb1,0x00); //ccb2[7:0] : reg setting for signal02 selection with d2u mode + set_lcm_register(0xCCb2,0x00); //ccb3[7:0] : reg setting for signal03 selection with d2u mode + set_lcm_register(0xCCb3,0x00); //ccb4[7:0] : reg setting for signal04 selection with d2u mode + set_lcm_register(0xCCb4,0x0D); //ccb5[7:0] : reg setting for signal05 selection with d2u mode + set_lcm_register(0xCCb5,0x0F); //ccb6[7:0] : reg setting for signal06 selection with d2u mode + set_lcm_register(0xCCb6,0x09); //ccb7[7:0] : reg setting for signal07 selection with d2u mode + set_lcm_register(0xCCb7,0x0B); //ccb8[7:0] : reg setting for signal08 selection with d2u mode + set_lcm_register(0xCCb8,0x02); //ccb9[7:0] : reg setting for signal09 selection with d2u mode + set_lcm_register(0xCCb9,0x01); //ccba[7:0] : reg setting for signal10 selection with d2u mode + + // cccx + set_lcm_register(0xCCc0,0x00); //ccc1[7:0] : reg setting for signal11 selection with d2u mode + set_lcm_register(0xCCc1,0x00); //ccc2[7:0] : reg setting for signal12 selection with d2u mode + set_lcm_register(0xCCc2,0x00); //ccc3[7:0] : reg setting for signal13 selection with d2u mode + set_lcm_register(0xCCc3,0x00); //ccc4[7:0] : reg setting for signal14 selection with d2u mode + set_lcm_register(0xCCc4,0x00); //ccc5[7:0] : reg setting for signal15 selection with d2u mode + set_lcm_register(0xCCc5,0x00); //ccc6[7:0] : reg setting for signal16 selection with d2u mode + set_lcm_register(0xCCc6,0x00); //ccc7[7:0] : reg setting for signal17 selection with d2u mode + set_lcm_register(0xCCc7,0x00); //ccc8[7:0] : reg setting for signal18 selection with d2u mode + set_lcm_register(0xCCc8,0x00); //ccc9[7:0] : reg setting for signal19 selection with d2u mode + set_lcm_register(0xCCc9,0x00); //ccca[7:0] : reg setting for signal20 selection with d2u mode + set_lcm_register(0xCCca,0x00); //cccb[7:0] : reg setting for signal21 selection with d2u mode + set_lcm_register(0xCCcb,0x00); //cccc[7:0] : reg setting for signal22 selection with d2u mode + set_lcm_register(0xCCcc,0x00); //cccd[7:0] : reg setting for signal23 selection with d2u mode + set_lcm_register(0xCCcd,0x00); //ccce[7:0] : reg setting for signal24 selection with d2u mode + set_lcm_register(0xCCce,0x0E); //cccf[7:0] : reg setting for signal25 selection with d2u mode + + // ccdx + set_lcm_register(0xCCd0,0x10); //ccd1[7:0] : reg setting for signal26 selection with d2u mode + set_lcm_register(0xCCd1,0x0A); //ccd2[7:0] : reg setting for signal27 selection with d2u mode + set_lcm_register(0xCCd2,0x0C); //ccd3[7:0] : reg setting for signal28 selection with d2u mode + set_lcm_register(0xCCd3,0x04); //ccd4[7:0] : reg setting for signal29 selection with d2u mode + set_lcm_register(0xCCd4,0x03); //ccd5[7:0] : reg setting for signal30 selection with d2u mode + set_lcm_register(0xCCd5,0x00); //ccd6[7:0] : reg setting for signal31 selection with d2u mode + set_lcm_register(0xCCd6,0x00); //ccd7[7:0] : reg setting for signal32 selection with d2u mode + set_lcm_register(0xCCd7,0x00); //ccd8[7:0] : reg setting for signal33 selection with d2u mode + set_lcm_register(0xCCd8,0x00); //ccd9[7:0] : reg setting for signal34 selection with d2u mode + set_lcm_register(0xCCd9,0x00); //ccda[7:0] : reg setting for signal35 selection with d2u mode + set_lcm_register(0xCCda,0x00); //ccdb[7:0] : reg setting for signal36 selection with d2u mode + set_lcm_register(0xCCdb,0x00); //ccdc[7:0] : reg setting for signal37 selection with d2u mode + set_lcm_register(0xCCdc,0x00); //ccdd[7:0] : reg setting for signal38 selection with d2u mode + set_lcm_register(0xCCdd,0x00); //ccde[7:0] : reg setting for signal39 selection with d2u mode + set_lcm_register(0xCCde,0x00); //ccdf[7:0] : reg setting for signal40 selection with d2u mode + + ///=====================); set_lcm_register(0x======== + set_lcm_register(0x3A00,0x77); //MCU 16bits D[17:0] 77 66 / + send_ctrl_cmd(0x1100); + MDELAY(200); // 120 / + send_ctrl_cmd(0x2900); + MDELAY(100); //200 / +#endif + +#if 0//read ID OTM8018B + + SPI_read_data(0xD200,1); //0x01 + SPI_read_data(0xD201,1); //0x8B + SPI_read_data(0xD202,1); //0x80 + SPI_read_data(0xD203,1); //0x09 +#endif + + + +#if 1 // //ORSIE ṩ120604 OTM8018B+4.3HSD + +/* +#define VBPD_tru 15 +#define VFPD_tru 16 +#define VSPW_tru 1 +#define HBPD_tru 28 +#define HFPD_tru 28 +#define HSPW_tru 4 +#define CLKVAL_tru 1 + +*/ + send_ctrl_cmd(0xff00); // + send_data_cmd(0x80); + send_ctrl_cmd(0xff01); // enable EXTC + send_data_cmd(0x09); + send_ctrl_cmd(0xff02); // + send_data_cmd(0x01); + + send_ctrl_cmd(0xff80); // enable Orise mode + send_data_cmd(0x80); + send_ctrl_cmd(0xff81); // + send_data_cmd(0x09); + + + + send_ctrl_cmd(0xC582); //REG-pump23 + send_data_cmd(0xA3); + send_ctrl_cmd(0xC590); //Pump setting (3x=D6)-->(2x=96)//v02 01/11 + send_data_cmd(0x96); + send_ctrl_cmd(0xC591); //Pump setting(VGH/VGL) + send_data_cmd(0x8F); + + send_ctrl_cmd(0xD800); //GVDD=4.5V + send_data_cmd(0x75); + send_ctrl_cmd(0xD801); //NGVDD=4.5V + send_data_cmd(0x73); + //VCOMDC + send_ctrl_cmd(0xd900); // VCOMDC= + send_data_cmd(0x5E); + + send_ctrl_cmd(0xc0b4); + send_data_cmd(0x50); //0x00 1 dot inversion; 0x10 1+2dot inversion; 0x50 column inversion + + send_ctrl_cmd(0xE100); send_data_cmd(0x09); + send_ctrl_cmd(0xE101); send_data_cmd(0x0a); + send_ctrl_cmd(0xE102); send_data_cmd(0x0e); + send_ctrl_cmd(0xE103); send_data_cmd(0x0d); + send_ctrl_cmd(0xE104); send_data_cmd(0x07); + send_ctrl_cmd(0xE105); send_data_cmd(0x18); + send_ctrl_cmd(0xE106); send_data_cmd(0x0d); + send_ctrl_cmd(0xE107); send_data_cmd(0x0d); + send_ctrl_cmd(0xE108); send_data_cmd(0x01); + send_ctrl_cmd(0xE109); send_data_cmd(0x04); + send_ctrl_cmd(0xE10A); send_data_cmd(0x05); + send_ctrl_cmd(0xE10B); send_data_cmd(0x06); + send_ctrl_cmd(0xE10C); send_data_cmd(0x0e); + send_ctrl_cmd(0xE10D); send_data_cmd(0x25); + send_ctrl_cmd(0xE10E); send_data_cmd(0x22); + send_ctrl_cmd(0xE10F); send_data_cmd(0x05); + + // Negative + send_ctrl_cmd(0xE200); send_data_cmd(0x09); + send_ctrl_cmd(0xE201); send_data_cmd(0x0a); + send_ctrl_cmd(0xE202); send_data_cmd(0x0e); + send_ctrl_cmd(0xE203); send_data_cmd(0x0d); + send_ctrl_cmd(0xE204); send_data_cmd(0x07); + send_ctrl_cmd(0xE205); send_data_cmd(0x18); + send_ctrl_cmd(0xE206); send_data_cmd(0x0d); + send_ctrl_cmd(0xE207); send_data_cmd(0x0d); + send_ctrl_cmd(0xE208); send_data_cmd(0x01); + send_ctrl_cmd(0xE209); send_data_cmd(0x04); + send_ctrl_cmd(0xE20A); send_data_cmd(0x05); + send_ctrl_cmd(0xE20B); send_data_cmd(0x06); + send_ctrl_cmd(0xE20C); send_data_cmd(0x0e); + send_ctrl_cmd(0xE20D); send_data_cmd(0x25); + send_ctrl_cmd(0xE20E); send_data_cmd(0x22); + send_ctrl_cmd(0xE20F); send_data_cmd(0x05); + + send_ctrl_cmd(0xC181); //Frame rate 65Hz//V02 + send_data_cmd(0x66); + + // RGB I/F setting VSYNC for OTM8018 0x0e + + send_ctrl_cmd(0xC1a1); //external Vsync(08) /Vsync,Hsync(0c) /Vsync,Hsync,DE(0e) //V02(0e) / all included clk(0f) + send_data_cmd(0x08); + + + send_ctrl_cmd(0xC489); //source bias //V02 + send_data_cmd(0x08); + + send_ctrl_cmd(0xC0A2); + send_data_cmd(0x18); + send_ctrl_cmd(0xC0A3); + send_data_cmd(0x00); + send_ctrl_cmd(0xC0A4); + send_data_cmd(0x09); + send_ctrl_cmd(0xC481); + send_data_cmd(0x83); + + send_ctrl_cmd(0xC592); //Pump45 + send_data_cmd(0x01);//(01) + + send_ctrl_cmd(0xC5B1); //DC voltage setting ;[0]GVDD output, default: 0xa8 + send_data_cmd(0xA9); + + send_ctrl_cmd(0xB392); + send_data_cmd(0x45); + send_ctrl_cmd(0xB390); + send_data_cmd(0x02); + + send_ctrl_cmd(0xC080); + send_data_cmd(0x00); + send_ctrl_cmd(0xC081); + send_data_cmd(0x58); + send_ctrl_cmd(0xC082); + send_data_cmd(0x00); + send_ctrl_cmd(0xC083); + send_data_cmd(0x14); + send_ctrl_cmd(0xC084); + send_data_cmd(0x16); + + send_ctrl_cmd(0xF5C1); + send_data_cmd(0xC0); + send_ctrl_cmd(0xC090); + send_data_cmd(0x00); + send_ctrl_cmd(0xC091); + send_data_cmd(0x44); + send_ctrl_cmd(0xC092); + send_data_cmd(0x00); + send_ctrl_cmd(0xC093); + send_data_cmd(0x00); + send_ctrl_cmd(0xC094); + send_data_cmd(0x00); + send_ctrl_cmd(0xC095); + send_data_cmd(0x03); + + send_ctrl_cmd(0xC1A6); + send_data_cmd(0x00); + send_ctrl_cmd(0xC1A7); + send_data_cmd(0x00); + send_ctrl_cmd(0xC1A8); + send_data_cmd(0x00); + +//-------------------------------------------------------------------------------- +// initial setting 2 < tcon_goa_wave > +//-------------------------------------------------------------------------------- +// CE8x : vst1, vst2, vst3, vst4 + send_ctrl_cmd(0xCE80); // ce81[7:0] : vst1_shift[7:0] + send_data_cmd(0x86); + send_ctrl_cmd(0xCE81); // ce82[7:0] : 0000, vst1_width[3:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xCE82); // ce83[7:0] : vst1_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCE83); // ce84[7:0] : vst2_shift[7:0] + send_data_cmd(0x85); + send_ctrl_cmd(0xCE84); // ce85[7:0] : 0000, vst2_width[3:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xCE85); // ce86[7:0] : vst2_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCE86); // ce87[7:0] : vst3_shift[7:0] + send_data_cmd(0x84); + send_ctrl_cmd(0xCE87); // ce88[7:0] : 0000, vst3_width[3:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xCE88); // ce89[7:0] : vst3_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCE89); // ce8a[7:0] : vst4_shift[7:0] + send_data_cmd(0x83); + send_ctrl_cmd(0xCE8a); // ce8b[7:0] : 0000, vst4_width[3:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xCE8b); // ce8c[7:0] : vst4_tchop[7:0] + send_data_cmd(0x00); + +//CEAx : clka1, clka2 + send_ctrl_cmd(0xCEa0); // cea1[7:0] : clka1_width[3:0], clka1_shift[11:8] + send_data_cmd(0x38); + send_ctrl_cmd(0xCEa1); // cea2[7:0] : clka1_shift[7:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEa2); // cea3[7:0] : clka1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEa3); // cea4[7:0] : clka1_switch[7:0] + send_data_cmd(0x58); + send_ctrl_cmd(0xCEa4); // cea5[7:0] : clka1_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEa5); // cea6[7:0] : clka1_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEa6); // cea7[7:0] : clka1_tglue[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEa7); // cea8[7:0] : clka2_width[3:0], clka2_shift[11:8] + send_data_cmd(0x38); + send_ctrl_cmd(0xCEa8); // cea9[7:0] : clka2_shift[7:0] + send_data_cmd(0x02); + send_ctrl_cmd(0xCEa9); // ceaa[7:0] : clka2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEaa); // ceab[7:0] : clka2_switch[7:0] + send_data_cmd(0x59); + send_ctrl_cmd(0xCEab); // ceac[7:0] : clka2_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xCEac); // cead[7:0] : clka2_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xCEad); // ceae[7:0] : clka2_tglue + send_data_cmd(0x00); + +//CEBx : clka3, clka4 + send_ctrl_cmd(0xCEb0); // ceb1[7:0] : clka3_width[3:0], clka3_shift[11:8] + send_data_cmd(0x38); + send_ctrl_cmd(0xCEb1); // ceb2[7:0] : clka3_shift[7:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xCEb2); // ceb3[7:0] : clka3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEb3); // ceb4[7:0] : clka3_switch[7:0] + send_data_cmd(0x5A); + send_ctrl_cmd(0xCEb4); // ceb5[7:0] : clka3_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEb5); // ceb6[7:0] : clka3_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEb6); // ceb7[7:0] : clka3_tglue[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEb7); // ceb8[7:0] : clka4_width[3:0], clka2_shift[11:8] + send_data_cmd(0x38); + send_ctrl_cmd(0xCEb8); // ceb9[7:0] : clka4_shift[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEb9); // ceba[7:0] : clka4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEba); // cebb[7:0] : clka4_switch[7:0] + send_data_cmd(0x5b); //0x57 + send_ctrl_cmd(0xCEbb); // cebc[7:0] : clka4_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xCEbc); // cebd[7:0] : clka4_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xCEbd); // cebe[7:0] : clka4_tglue + send_data_cmd(0x00); + +//CECx : clkb1, clkb2 + send_ctrl_cmd(0xCEc0); // cec1[7:0] : clkb1_width[3:0], clkb1_shift[11:8] + send_data_cmd(0x30); + send_ctrl_cmd(0xCEc1); // cec2[7:0] : clkb1_shift[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEc2); // cec3[7:0] : clkb1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEc3); // cec4[7:0] : clkb1_switch[7:0] + send_data_cmd(0x5C); + send_ctrl_cmd(0xCEc4); // cec5[7:0] : clkb1_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEc5); // cec6[7:0] : clkb1_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEc6); // cec7[7:0] : clkb1_tglue[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEc7); // cec8[7:0] : clkb2_width[3:0], clkb2_shift[11:8] + send_data_cmd(0x30); + send_ctrl_cmd(0xCEc8); // cec9[7:0] : clkb2_shift[7:0] + send_data_cmd(0x01); + send_ctrl_cmd(0xCEc9); // ceca[7:0] : clkb2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEca); // cecb[7:0] : clkb2_switch[7:0] + send_data_cmd(0x5D); + send_ctrl_cmd(0xCEcb); // cecc[7:0] : clkb2_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xCEcc); // cecd[7:0] : clkb2_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xCEcd); // cece[7:0] : clkb2_tglue + send_data_cmd(0x00); + +//CEDx : clkb3, clkb4 + send_ctrl_cmd(0xCEd0); // ced1[7:0] : clkb3_width[3:0], clkb3_shift[11:8] + send_data_cmd(0x30); + send_ctrl_cmd(0xCEd1); // ced2[7:0] : clkb3_shift[7:0] + send_data_cmd(0x02); + send_ctrl_cmd(0xCEd2); // ced3[7:0] : clkb3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEd3); // ced4[7:0] : clkb3_switch[7:0] + send_data_cmd(0x5E); + send_ctrl_cmd(0xCEd4); // ced5[7:0] : clkb3_extend[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEd5); // ced6[7:0] : clkb3_tchop[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEd6); // ced7[7:0] : clkb3_tglue[7:0] + send_data_cmd(0x00); + send_ctrl_cmd(0xCEd7); // ced8[7:0] : clkb4_width[3:0], clkb4_shift[11:8] + send_data_cmd(0x30); + send_ctrl_cmd(0xCEd8); // ced9[7:0] : clkb4_shift[7:0] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEd9); // ceda[7:0] : clkb4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + send_data_cmd(0x03); + send_ctrl_cmd(0xCEda); // cedb[7:0] : clkb4_switch[7:0] + send_data_cmd(0x5B); + send_ctrl_cmd(0xCEdb); // cedc[7:0] : clkb4_extend + send_data_cmd(0x00); + send_ctrl_cmd(0xCEdc); // cedd[7:0] : clkb4_tchop + send_data_cmd(0x00); + send_ctrl_cmd(0xCEdd); // cede[7:0] : clkb4_tglue + send_data_cmd(0x00); + +//CFCx : + + send_data_cmd(0x00); + send_ctrl_cmd(0xCFc7); // cfc8[7:0] : reg_goa_gnd_opt, reg_goa_dpgm_tail_set, reg_goa_f_gating_en, reg_goa_f_odd_gating, toggle_mod1, 2, 3, 4 + send_data_cmd(0x00); + + send_ctrl_cmd(0xCFc9); // cfca[7:0] : reg_goa_gnd_period[7:0] + send_data_cmd(0x00); + +//CFDx : + + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- +// cbcx + + send_ctrl_cmd(0xCBc4); //cbc5[7:0] : enmode H-byte of sig5 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBc5); //cbc6[7:0] : enmode H-byte of sig6 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBc6); //cbc7[7:0] : enmode H-byte of sig7 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBc7); //cbc8[7:0] : enmode H-byte of sig8 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBc8); //cbc9[7:0] : enmode H-byte of sig9 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBc9); //cbca[7:0] : enmode H-byte of sig10 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + + send_ctrl_cmd(0xCBd9); //cbda[7:0] : enmode H-byte of sig25 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBda); //cbdb[7:0] : enmode H-byte of sig26 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBdb); //cbdc[7:0] : enmode H-byte of sig27 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBdc); //cbdd[7:0] : enmode H-byte of sig28 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBdd); //cbde[7:0] : enmode H-byte of sig29 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + send_ctrl_cmd(0xCBde); //cbdf[7:0] : enmode H-byte of sig30 (pwrof_0, pwrof_1, norm, pwron_4 ) + send_data_cmd(0x04); + +// cbex + + send_ctrl_cmd(0xCC84); //cc85[7:0] : reg setting for signal05 selection with u2d mode + send_data_cmd(0x0C); + send_ctrl_cmd(0xCC85); //cc86[7:0] : reg setting for signal06 selection with u2d mode + send_data_cmd(0x0A); + send_ctrl_cmd(0xCC86); //cc87[7:0] : reg setting for signal07 selection with u2d mode + send_data_cmd(0x10); + send_ctrl_cmd(0xCC87); //cc88[7:0] : reg setting for signal08 selection with u2d mode + send_data_cmd(0x0E); + send_ctrl_cmd(0xCC88); //cc89[7:0] : reg setting for signal09 selection with u2d mode + send_data_cmd(0x03); + send_ctrl_cmd(0xCC89); //cc8a[7:0] : reg setting for signal10 selection with u2d mode + send_data_cmd(0x04); + +// cc9x + +// ccax + send_ctrl_cmd(0xCCa0); //cca1[7:0] : reg setting for signal26 selection with u2d mode + send_data_cmd(0x09); + send_ctrl_cmd(0xCCa1); //cca2[7:0] : reg setting for signal27 selection with u2d mode + send_data_cmd(0x0F); + send_ctrl_cmd(0xCCa2); //cca3[7:0] : reg setting for signal28 selection with u2d mode + send_data_cmd(0x0D); + send_ctrl_cmd(0xCCa3); //cca4[7:0] : reg setting for signal29 selection with u2d mode + send_data_cmd(0x01); + send_ctrl_cmd(0xCCa4); //cca5[7:0] : reg setting for signal20 selection with u2d mode + send_data_cmd(0x02); + + send_ctrl_cmd(0xCCb4); //ccb5[7:0] : reg setting for signal05 selection with d2u mode + send_data_cmd(0x0D); + send_ctrl_cmd(0xCCb5); //ccb6[7:0] : reg setting for signal06 selection with d2u mode + send_data_cmd(0x0F); + send_ctrl_cmd(0xCCb6); //ccb7[7:0] : reg setting for signal07 selection with d2u mode + send_data_cmd(0x09); + send_ctrl_cmd(0xCCb7); //ccb8[7:0] : reg setting for signal08 selection with d2u mode + send_data_cmd(0x0B); + send_ctrl_cmd(0xCCb8); //ccb9[7:0] : reg setting for signal09 selection with d2u mode + send_data_cmd(0x02); + send_ctrl_cmd(0xCCb9); //ccba[7:0] : reg setting for signal10 selection with d2u mode + send_data_cmd(0x01); + +// cccx + + send_ctrl_cmd(0xCCce); //cccf[7:0] : reg setting for signal25 selection with d2u mode + send_data_cmd(0x0E); + +// ccdx + send_ctrl_cmd(0xCCd0); //ccd1[7:0] : reg setting for signal26 selection with d2u mode + send_data_cmd(0x10); + send_ctrl_cmd(0xCCd1); //ccd2[7:0] : reg setting for signal27 selection with d2u mode + send_data_cmd(0x0A); + send_ctrl_cmd(0xCCd2); //ccd3[7:0] : reg setting for signal28 selection with d2u mode + send_data_cmd(0x0C); + send_ctrl_cmd(0xCCd3); //ccd4[7:0] : reg setting for signal29 selection with d2u mode + send_data_cmd(0x04); + send_ctrl_cmd(0xCCd4); //ccd5[7:0] : reg setting for signal30 selection with d2u mode + send_data_cmd(0x03); + + + + send_ctrl_cmd(0x3A00); // RGB 18bits D[17:0] + send_data_cmd(0x77); + + send_ctrl_cmd(0x1100); + + MDELAY(120); + + send_ctrl_cmd(0x2900); + + MDELAY(50); +#endif +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0);//input + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, 0); + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42;//40? + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; //LCM_POLARITY_FALLING + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 28; + params->dpi.hsync_front_porch = 28; + params->dpi.vsync_pulse_width = 1;//10 + params->dpi.vsync_back_porch = 15;//33 + params->dpi.vsync_front_porch = 16;//12 + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} +#if 1 +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0,id1=0,id2=0; + + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(200); + + send_ctrl_cmd(0xd200); + spi_get_byte(0xc0); //spi_read_data(); + spi_get_byte(0xc0); //spi_read_data(); + spi_get_byte(0xc0); //spi_read_data(); + id1 = spi_get_byte(0xc0); //spi_read_data(); + id2 = spi_get_byte(0xc0); //spi_read_data(); + MDELAY(20); + id = id1<<8 | id2; +#ifdef BUILD_UBOOT + printf("11111111111111111tengdeqianglcd_id222222222222222222=%x \r\n",id); +#else + printk("11111111111111111tengdeqianglcd_id2222222222222222222 id=%x,id1=%x,id2=%x\r\n",id,id1,id2); +#endif + + return (LCM_ID == id)?1:0; +} +#endif +static void lcm_suspend(void) +{ + //lcm_compare_id(); + send_ctrl_cmd(0x2800); + MDELAY(100); + send_ctrl_cmd(0x1000); +} + +static void lcm_resume(void) +{ + //lcm_compare_id(); + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(100); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER tft3p2710_fwvga_otm8018b_lcm_drv = +{ + + .name = "tft3p2710_fwvga_otm8018b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id, +}; diff --git a/acer_e350_simcom75/lcm/tr3p2497_fwvga_hx8363b/tr3p2497_fwvga_hx8363b.c b/acer_e350_simcom75/lcm/tr3p2497_fwvga_hx8363b/tr3p2497_fwvga_hx8363b.c new file mode 100644 index 0000000..b619c7c --- /dev/null +++ b/acer_e350_simcom75/lcm/tr3p2497_fwvga_hx8363b/tr3p2497_fwvga_hx8363b.c @@ -0,0 +1,555 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- +//#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int temp=(CTRL_ID | (cmd & 0xFF)); + unsigned int i; + + SET_LSCE_HIGH; + UDELAY(5); + SET_LSCE_LOW; + UDELAY(3); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(3); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_LOW; + if (temp & (1 << 8)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(3); + SET_LSCK_HIGH; + UDELAY(3); + temp <<= 1; + } + + //SET_LSDA_HIGH; + //SET_LSCE_HIGH; + +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int temp=(DATA_ID | (data & 0xFF)); + unsigned int i; + + SET_LSCE_LOW; + UDELAY(3); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(3); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_LOW; + if (temp & (1 << 8)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(3); + SET_LSCK_HIGH; + UDELAY(3); + temp <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; + +} + + + + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); // + send_data_cmd(0x83); // + send_data_cmd(0x63); // + + + + send_ctrl_cmd(0xB1); //Set_POWER + send_data_cmd(0x01); // himax 1para + send_data_cmd(0x00); // himax 2para + send_data_cmd(0x46); // hiamx 3para + send_data_cmd(0x08); // + send_data_cmd(0x01); // + send_data_cmd(0x0F); // + send_data_cmd(0x0F); // + send_data_cmd(0x12); // + send_data_cmd(0x1A); // + send_data_cmd(0x3F); // + send_data_cmd(0x3F); // + send_data_cmd(0x40); // + send_data_cmd(0x32); // + send_data_cmd(0x00); // + send_data_cmd(0xE6); // + send_data_cmd(0xE6); // + send_data_cmd(0xE6); // + send_data_cmd(0xE6); // + send_data_cmd(0xE6); // + + + + send_ctrl_cmd(0xB2); // SET DISP + send_data_cmd(0x08); // + send_data_cmd(0x03); // + + send_ctrl_cmd(0xB4); //Set_CYC CPT + send_data_cmd(0x00); // 2 Dot INV CPT + send_data_cmd(0x18); + send_data_cmd(0x9C); // + send_data_cmd(0x08); // + send_data_cmd(0x18); // + send_data_cmd(0x04); // + send_data_cmd(0x72); // + + send_ctrl_cmd(0xB6); //Set_VCOM + send_data_cmd(0x47); //0x10 + + send_ctrl_cmd(0xCC); // SET Panel + send_data_cmd(0x01); // + MDELAY(5); + + + send_ctrl_cmd(0xE0); // SET Gamma 4.05" + send_data_cmd(0x00); + send_data_cmd(0x05); + send_data_cmd(0x01); + send_data_cmd(0x20); + send_data_cmd(0x31); + send_data_cmd(0x3F); + send_data_cmd(0x11); + send_data_cmd(0x26); + send_data_cmd(0x80); + send_data_cmd(0x86); + send_data_cmd(0xCF); + send_data_cmd(0xD5); + send_data_cmd(0xD7); + send_data_cmd(0x16); + send_data_cmd(0x16); + send_data_cmd(0x12); + send_data_cmd(0x18); + send_data_cmd(0x00); + send_data_cmd(0x05); + send_data_cmd(0x01); + send_data_cmd(0x20); + send_data_cmd(0x31); + send_data_cmd(0x3F); + send_data_cmd(0x11); + send_data_cmd(0x26); + send_data_cmd(0x80); + send_data_cmd(0x86); + send_data_cmd(0xCF); + send_data_cmd(0xD5); + send_data_cmd(0xD7); + send_data_cmd(0x16); + send_data_cmd(0x16); + send_data_cmd(0x12); + send_data_cmd(0x18); + + send_ctrl_cmd(0xC1); // SET DGC + send_data_cmd(0x01); + //R + send_data_cmd(0x00 ); + send_data_cmd(0x03 ); + send_data_cmd(0x06 ); + send_data_cmd(0x09 ); + send_data_cmd(0x0E ); + send_data_cmd(0x13 ); + send_data_cmd(0x18 ); + send_data_cmd(0x1B ); + send_data_cmd(0x20 ); + send_data_cmd(0x24 ); + send_data_cmd(0x29 ); + send_data_cmd(0x2D ); + send_data_cmd(0x31 ); + send_data_cmd(0x36 ); + send_data_cmd(0x3F ); + send_data_cmd(0x4A ); + send_data_cmd(0x53 ); + send_data_cmd(0x5E ); + send_data_cmd(0x68 ); + send_data_cmd(0x72 ); + send_data_cmd(0x7D ); + send_data_cmd(0x86 ); + send_data_cmd(0x92 ); + send_data_cmd(0x9E ); + send_data_cmd(0xA6 ); + send_data_cmd(0xB2 ); + send_data_cmd(0xBB ); + send_data_cmd(0xC7 ); + send_data_cmd(0xCF ); + send_data_cmd(0xD6 ); + send_data_cmd(0xE1 ); + send_data_cmd(0xEC ); + send_data_cmd(0xFF ); + send_data_cmd(0xFF ); + send_data_cmd(0xB6 ); + send_data_cmd(0x21 ); + send_data_cmd(0xBF ); + send_data_cmd(0xA9 ); + send_data_cmd(0xDD ); + send_data_cmd(0xB8 ); + send_data_cmd(0xB9 ); + send_data_cmd(0x00 ); + + //G + send_data_cmd(0x00 ); + send_data_cmd(0x03 ); + send_data_cmd(0x06 ); + send_data_cmd(0x09 ); + send_data_cmd(0x0E ); + send_data_cmd(0x13 ); + send_data_cmd(0x18 ); + send_data_cmd(0x1B ); + send_data_cmd(0x20 ); + send_data_cmd(0x24 ); + send_data_cmd(0x29 ); + send_data_cmd(0x2D ); + send_data_cmd(0x31 ); + send_data_cmd(0x36 ); + send_data_cmd(0x3F ); + send_data_cmd(0x4A ); + send_data_cmd(0x53 ); + send_data_cmd(0x5E ); + send_data_cmd(0x68 ); + send_data_cmd(0x72 ); + send_data_cmd(0x7D ); + send_data_cmd(0x86 ); + send_data_cmd(0x92 ); + send_data_cmd(0x9E ); + send_data_cmd(0xA6 ); + send_data_cmd(0xB2 ); + send_data_cmd(0xBB ); + send_data_cmd(0xC7 ); + send_data_cmd(0xCF ); + send_data_cmd(0xD6 ); + send_data_cmd(0xE1 ); + send_data_cmd(0xEC ); + send_data_cmd(0xFF ); + send_data_cmd(0xFF ); + send_data_cmd(0xB6 ); + send_data_cmd(0x21 ); + send_data_cmd(0xBF ); + send_data_cmd(0xA9 ); + send_data_cmd(0xDD ); + send_data_cmd(0xB8 ); + send_data_cmd(0xB9 ); + send_data_cmd(0x00 ); + + //B + send_data_cmd(0x00 ); + send_data_cmd(0x03 ); + send_data_cmd(0x06 ); + send_data_cmd(0x09 ); + send_data_cmd(0x0E ); + send_data_cmd(0x13 ); + send_data_cmd(0x18 ); + send_data_cmd(0x1B ); + send_data_cmd(0x20 ); + send_data_cmd(0x24 ); + send_data_cmd(0x29 ); + send_data_cmd(0x2D ); + send_data_cmd(0x31 ); + send_data_cmd(0x36 ); + send_data_cmd(0x3F ); + send_data_cmd(0x4A ); + send_data_cmd(0x53 ); + send_data_cmd(0x5E ); + send_data_cmd(0x68 ); + send_data_cmd(0x72 ); + send_data_cmd(0x7D ); + send_data_cmd(0x86 ); + send_data_cmd(0x92 ); + send_data_cmd(0x9E ); + send_data_cmd(0xA6 ); + send_data_cmd(0xB2 ); + send_data_cmd(0xBB ); + send_data_cmd(0xC7 ); + send_data_cmd(0xCF ); + send_data_cmd(0xD6 ); + send_data_cmd(0xE1 ); + send_data_cmd(0xEC ); + send_data_cmd(0xFF ); + send_data_cmd(0xFF ); + send_data_cmd(0xB6 ); + send_data_cmd(0x21 ); + send_data_cmd(0xBF ); + send_data_cmd(0xA9 ); + send_data_cmd(0xDD ); + send_data_cmd(0xB8 ); + send_data_cmd(0xB9 ); + send_data_cmd(0x00 ); + + send_ctrl_cmd(0x3A); //COLMOD + send_data_cmd(0x77); // + send_ctrl_cmd(0x11);//Sleep Out + MDELAY(200); + + send_ctrl_cmd(0xC2); // SET DISPIF + send_data_cmd(0x04); //24bit + + send_ctrl_cmd(0x35); //Tearing Effect + send_data_cmd(0x00); // + send_ctrl_cmd(0x36); //Memory Access Control + send_data_cmd(0x02); // + MDELAY(40); + + send_ctrl_cmd(0x29); + MDELAY(10); + send_ctrl_cmd(0x2c); +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + //lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + //lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 46;//40? + params->dpi.mipi_pll_clk_div2 = 9; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol =LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + + params->dpi.hsync_pulse_width = 20; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 12; + params->dpi.vsync_pulse_width = 4; + params->dpi.vsync_back_porch = 5; + params->dpi.vsync_front_porch = 5; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + SET_LSCE_HIGH; + SET_LSCK_HIGH; + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + send_ctrl_cmd(0x28); + MDELAY(50); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(100); + send_ctrl_cmd(0x29); + MDELAY(50); +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER tr3p2497_fwvga_hx8363b_lcm_drv = +{ + + .name = "tr3p2497_fwvga_hx8363b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/acer_e350_simcom75/lcm/yt40f51x6_wvga_ili9805_dsi/yt40f51x6_wvga_ili9805_dsi.c b/acer_e350_simcom75/lcm/yt40f51x6_wvga_ili9805_dsi/yt40f51x6_wvga_ili9805_dsi.c new file mode 100644 index 0000000..185a779 --- /dev/null +++ b/acer_e350_simcom75/lcm/yt40f51x6_wvga_ili9805_dsi/yt40f51x6_wvga_ili9805_dsi.c @@ -0,0 +1,758 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define REGFLAG_DELAY 0x00 //0XFE +#define REGFLAG_END_OF_TABLE 0x01//0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ +#ifdef BUILD_UBOOT + printf("[LONG]lcm_set_util_funcs\r\n"); +#else + // printf("[LONG]lcm_set_util_funcs\r\n"); +#endif + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + +#ifdef BUILD_UBOOT + printf("[LONG]lcm_get_params\r\n"); +#else + printk("[LONG]lcm_get_params\r\n"); +#endif + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; //LCM_DBI_TE_MODE_DISABLED;// + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else +xx + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + + //params->dsi.DSI_WMEM_CONTI=0x3C; + //params->dsi.DSI_RMEM_CONTI=0x3E; + + //params->dsi.VC_NUM=0x0; + + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + + params->dsi.intermediat_buffer_num = 2; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=30;//38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_update(unsigned int x, unsigned int y,unsigned int width, unsigned int height); +static void lcm_setbacklight(unsigned int level); +static void lcm_resume(void); +static void lcm_clear(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + + for (x = 0; x < FRAME_WIDTH; ++ x) { + + lcm_util.send_data(color); + + } + + } + +} + +static void lcm_init(void) +{ + unsigned int array[16]; + unsigned int id = 0; + unsigned char buffer[4]; +unsigned int data_array[16]; + + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(120); +#ifdef BUILD_UBOOT + printf("[LONG],lcm_init\r\n"); +#else + printk("[LONG],lcm_init\r\n"); +#endif + + + + data_array[0]=0x00043902; + + data_array[1]=0x0598FFFF; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(1); + + //set 0xfd + data_array[0]=0x00053902; + + data_array[1]=0x441F0FFD; + + data_array[2]=0x00000000; + + dsi_set_cmdq(&data_array, 3, 1); + + MDELAY(1); + + + //SET 0XF8 + data_array[0] = 0x00103902; + + data_array[1] = 0x030330F8; + + data_array[2] = 0x30020230; + + data_array[3] = 0x01300101; + + data_array[4] = 0x01013001; + + dsi_set_cmdq(&data_array, 5, 1); + + MDELAY(1); + + + data_array[0]=0x00033902; + + data_array[1]=0x000F08EB; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(1); + + + + data_array[0] = 0x74B81500; + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + + + data_array[0] = 0x00F11500; + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + + + data_array[0]=0x00043902; + + data_array[1]=0x415800F2; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(1); + + + //SET 0XFC + + data_array[0]=0x00043902; + + data_array[1]=0x010F04FC; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(1); + + + + data_array[0]=0x00023902; + + data_array[1]=0x000019FE; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(400); + +// + data_array[0] = 0x00113902; + + data_array[1] = 0x1D0B00E0; //0x201B00E0; + + data_array[2] = 0x0E1F1515; //0x7B1C100D; + + data_array[3] = 0x0104000E; //0x0303000C; + + data_array[4] = 0x36370902; //0x3E3F0B05; + + data_array[5] = 0x00000000; //0x00000000; + + dsi_set_cmdq(&data_array, 6, 1); + + MDELAY(1); + +// + data_array[0] = 0x00113902; + + data_array[1] = 0x140B00E1; //0x312500E1; + + data_array[2] = 0x0D1F1313; //0x7C181314; + + data_array[3] = 0x0004000B; //0x0103000A; + + data_array[4] = 0x171C0C11; //0x0F130610; + + data_array[5] = 0x00000000; //0x00000000; + + dsi_set_cmdq(&data_array, 6, 1); + + MDELAY(1); + + + + data_array[0]=0x00053902; + + data_array[1]=0x0e3017C1;//0x103013C1; + + data_array[2]=0x00000026; + + dsi_set_cmdq(&data_array, 3, 1); + + MDELAY(1); + + + + data_array[0] = 0xb5C71500;//0xDCC71500; + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + + + data_array[0] = 0x00043902; // + + data_array[1] = 0x141200B1; // + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(5); + + + data_array[0] = 0x02B41500; + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(5); + + + data_array[0] = 0x0A361500; + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(5); + + + data_array[0] = 0x773A1500; // 24bit + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(5); + + + data_array[0] = 0x00B01500; + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(5); + + + data_array[0] = 0x01B61500; + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(5); + + + data_array[0] = 0x00210500; + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + + + data_array[0] = 0x00351500; // TE + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + +/* //del + data_array[0] = 0x000D3902; // CE function + +data_array[1] = 0x505050C5; + + data_array[2] = 0x50505058; + + data_array[3] = 0x70788058; + + data_array[4] = 0x00000068; + + dsi_set_cmdq(&data_array, 5, 1); + + MDELAY(1); + + + data_array[0] = 0x000D3902; // CE function + + data_array[1] = 0x808080C6; + + data_array[2] = 0x80808080; + + data_array[3] = 0x68707880; + + data_array[4] = 0x00000060; + + dsi_set_cmdq(&data_array, 5, 1); + + MDELAY(1); +*/ + + data_array[0]=0x00023902; + + data_array[1]=0x000011C2; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(1); + +/* //del + data_array[0]=0x00043902; + + data_array[1]=0xFFFF00F9; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(1); +*/ + + + data_array[0] = 0x00110500; // Sleep Out + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(120); + + + data_array[0] = 0x00290500; // Display On + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(20); + + +/* //del + data_array[0]=0x00033902; + + data_array[1]=0x00FFA6F9; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(1); + + + data_array[0]=0x00023902; + + data_array[1]=0x000000F9; + + dsi_set_cmdq(&data_array, 2, 1); + + MDELAY(1); +*/ + + data_array[0] = 0x00511500; // DBV[7:0] =0xFF + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + + + data_array[0] = 0x00531500;//0x2C531500; // BCTRL=1,BL=1 + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + + + + data_array[0] = 0x00551500;//0x01551500; // SET CABC UI MODE + + //data_array[0] = 0x00551500; // SET CABC UI MODE + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + + + data_array[0] = 0x005e1500;//0x705e1500; // SET CABC UI MODE 5E + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(1); + + +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; +#ifdef BUILD_UBOOT + printf("[LONG],lcm_suspend\r\n"); +#else + printk("[LONG],lcm_suspend\r\n"); +#endif + + data_array[0] = 0x00100500; // Sleep In + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(120); + +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; +#ifdef BUILD_UBOOT + printf("[LONG],lcm_resume\r\n"); +#else + printk("[LONG],lcm_resume\r\n"); +#endif + + data_array[0]=0x00053902; + + data_array[1]=0x0e3017C1;//0x103013C1; + + data_array[2]=0x00000026; + + dsi_set_cmdq(&data_array, 3, 1); + + MDELAY(1); + + data_array[0] = 0x00110500; // Sleep Out + + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(120); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + +#ifdef BUILD_UBOOT + printf("[LONG],lcm_update,%d,%d,%d,%d\r\n",x,y,width,height); +#else + printk("[LONG],lcm_update,%d,%d,%d,%d\r\n",x,y,width,height); +#endif + + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); +} + + + + + + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[4]; + unsigned int array[16]; + +#ifdef BUILD_UBOOT + printf("[LONG],lcm_compare_id\r\n"); +#else + printk("[LONG],lcm_compare_id\r\n"); +#endif + +return 1; + +} + + +#if 0 +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + + +static unsigned int lcm_esd_recover(void) +{ + + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} +#endif +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER yt40f51x6_wvga_ili9805_dsi_lcm_drv = +{ + .name = "ili9805_dsi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, +// .esd_check = lcm_esd_check, +// .esd_recover = lcm_esd_recover, +// .compare_id = lcm_compare_id, +#endif +}; diff --git a/acer_e350_simcom75/lcm/yt50f23c0_wvga_ili7800/yt50f23c0_wvga_ili7800.c b/acer_e350_simcom75/lcm/yt50f23c0_wvga_ili7800/yt50f23c0_wvga_ili7800.c new file mode 100644 index 0000000..050a26c --- /dev/null +++ b/acer_e350_simcom75/lcm/yt50f23c0_wvga_ili7800/yt50f23c0_wvga_ili7800.c @@ -0,0 +1,1010 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +#define ILI7800_SPI_8BIT +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +//#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +//punk +#define SET_GPIO_INPUT(n) (lcm_util.set_gpio_dir((n), (0))) +#define SET_GPIO_OUTPUT(n) (lcm_util.set_gpio_dir((n), (1))) +#define SET_LSDA_INPUT SET_GPIO_INPUT(LSDA_GPIO_PIN) +#define SET_LSDA_OUTPUT SET_GPIO_OUTPUT(LSDA_GPIO_PIN) +#define GET_LSDA_BIT mt_get_gpio_in(LSDA_GPIO_PIN) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + SET_LSCK_HIGH; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + SET_LSCE_LOW; + UDELAY(1); + + for (i = 0; i < 16; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 15)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +//punk, start +//#define RISING_TRIGGER +#define CTRL_ID (0 << 8) +#define DATA_ID (1 << 8) +static __inline void spi_send_data_9bit(unsigned int data) +{ + unsigned int i; +#ifdef RISING_TRIGGER + xx + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 8)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +#else + SET_LSCE_HIGH; + UDELAY(4); + SET_LSCK_LOW; + UDELAY(4); + SET_LSCE_LOW; + UDELAY(1); + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_HIGH; + if (data & (1 << 8)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_LOW; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +#endif + +} + + +static __inline void spi_send_data_9bit_internal(unsigned int data) +{ + unsigned int i; +#ifdef RISING_TRIGGER + UDELAY(1); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 8)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + +#else + UDELAY(1); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_HIGH; + if (data & (1 << 8)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_LOW; + UDELAY(1); + data <<= 1; + } + +#endif + +} + + +static __inline unsigned char spi_get_bytes_internal(unsigned int count,unsigned int buf[]) +{ + int i,k; + + for(i=0;i= 0; k--) + { + if (GET_LSDA_BIT) { + buf[i] |= (1 << k); + } + UDELAY(5); + } + } + +#else + for(i=0;i= 0; k--) + { + if (GET_LSDA_BIT) { + buf[i] |= (1 << k); + } + UDELAY(5); + } + } +#endif + + UDELAY(2); + +} + +static __inline void send_ctrl_cmd_8bit(unsigned int cmd) +{ + unsigned int out = (CTRL_ID | (cmd & 0xFF)); + spi_send_data_9bit(out); +} +static __inline void send_ctrl_cmd_8bit_internal(unsigned int cmd) +{ + unsigned int out = (CTRL_ID | (cmd & 0xFF)); + spi_send_data_9bit_internal(out); +} + +static __inline void send_data_cmd_8bit(unsigned int data) +{ + unsigned int out = (DATA_ID | (data & 0xFF)); + spi_send_data_9bit(out); +} + +static __inline void set_lcm_register_8bit(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd_8bit(regIndex); + send_data_cmd_8bit(regData); +} + + +static __inline unsigned char spi_read_reg(unsigned int reg,unsigned int count,unsigned int buf[]) +{ + SET_LSCE_LOW; + UDELAY(10); + + /*send reg addr*/ + send_ctrl_cmd_8bit_internal(reg); + + UDELAY(1); + SET_LSDA_INPUT; + + /*dumy clock*/ +#ifdef RISING_TRIGGER + UDELAY(1); + SET_LSCK_LOW; + UDELAY(5); + SET_LSCK_HIGH; + UDELAY(5); +#else + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(5); + SET_LSCK_LOW; + UDELAY(5); +#endif + + /*start read*/ + spi_get_bytes_internal(count,buf); + UDELAY(5); + + /*end read*/ + SET_LSCE_HIGH; + UDELAY(1); + SET_LSDA_OUTPUT; + UDELAY(5); +} + + +static __inline void backlight_ctrl(unsigned char cmd) +{ + + if(cmd) + { + //set backlight level + send_ctrl_cmd_8bit(0x51);send_data_cmd_8bit(cmd);//0x00~0xff + //set backlight on + send_ctrl_cmd_8bit(0x53);send_data_cmd_8bit(0x2c); + //set CABC on + send_ctrl_cmd_8bit(0x55);send_data_cmd_8bit(0x02);//still image + } + else + { + //set CABC off + send_ctrl_cmd_8bit(0x55);send_data_cmd_8bit(0x00); + //set backlight off + send_ctrl_cmd_8bit(0x53);send_data_cmd_8bit(0x00); + //set backlight level + send_ctrl_cmd_8bit(0x51);send_data_cmd_8bit(0x00);//0x00~0xff + } +} + +static void init_lcm_registers_8bit(void) +{ + +#ifdef BUILD_UBOOT + printf("punk,UBOOT init_lcm_registers_8bit\r\n"); +#else + printk("punk,kennel init_lcm_registers_8bit\r\n"); +#endif +send_ctrl_cmd_8bit(0xF3);send_data_cmd_8bit(0xAA); +send_ctrl_cmd_8bit(0x00);send_data_cmd_8bit(0x01); + +send_ctrl_cmd_8bit(0X2D);send_data_cmd_8bit(0X84); +send_ctrl_cmd_8bit(0XC3);send_data_cmd_8bit(0X4B); //res_sel +send_ctrl_cmd_8bit(0XC4);send_data_cmd_8bit(0X50); //osc adjustment +send_ctrl_cmd_8bit(0X15);send_data_cmd_8bit(0X20); //CKH level in the blanking region + +MDELAY(200); + +//CMD2 PAGE0 +send_ctrl_cmd_8bit(0x00);send_data_cmd_8bit(0x00); + +//power setting +send_ctrl_cmd_8bit(0X01);send_data_cmd_8bit(0X64); +send_ctrl_cmd_8bit(0X02);send_data_cmd_8bit(0X22); //AVDDP1 & AVDDP2 voltage adjust +send_ctrl_cmd_8bit(0X03);send_data_cmd_8bit(0X44); //AVDDP1 & AVDDP2 ratio adjust +send_ctrl_cmd_8bit(0X04);send_data_cmd_8bit(0X2B); //Frame rate setting +send_ctrl_cmd_8bit(0X05);send_data_cmd_8bit(0X2B); //Frame rate setting +send_ctrl_cmd_8bit(0X06);send_data_cmd_8bit(0X2B); //Frame rate setting + +send_ctrl_cmd_8bit(0X08);send_data_cmd_8bit(0X33); //AVDDP1 & AVDDP2 pump clock frequence + + +send_ctrl_cmd_8bit(0X09);send_data_cmd_8bit(0X12); //VGH & VGL & VCL pump clock frequence + + +send_ctrl_cmd_8bit(0X0A);send_data_cmd_8bit(0X13); +send_ctrl_cmd_8bit(0X0C);send_data_cmd_8bit(0X12); //VGH & VGL & VCL pump clock frequence + + +send_ctrl_cmd_8bit(0X0F);send_data_cmd_8bit(0X12); //VGH & VGL & VCL pump clock frequence + + + +send_ctrl_cmd_8bit(0X12);send_data_cmd_8bit(0X07); //ckh prech on/off=> 07h/00h +send_ctrl_cmd_8bit(0X13);send_data_cmd_8bit(0X11); +send_ctrl_cmd_8bit(0X14);send_data_cmd_8bit(0X40); //VR voltage set +send_ctrl_cmd_8bit(0X15);send_data_cmd_8bit(0X4A); //GVDDP voltage set +send_ctrl_cmd_8bit(0X16);send_data_cmd_8bit(0X6E); //GVDDN voltage set +send_ctrl_cmd_8bit(0X1C);send_data_cmd_8bit(0XFD); +send_ctrl_cmd_8bit(0X1D);send_data_cmd_8bit(0X01); +send_ctrl_cmd_8bit(0X1E);send_data_cmd_8bit(0X0B); + +send_ctrl_cmd_8bit(0XA3);send_data_cmd_8bit(0XFA); +send_ctrl_cmd_8bit(0XA4);send_data_cmd_8bit(0X3C); +send_ctrl_cmd_8bit(0XA5);send_data_cmd_8bit(0XC4); +send_ctrl_cmd_8bit(0XA6);send_data_cmd_8bit(0X05); + +send_ctrl_cmd_8bit(0XD3);send_data_cmd_8bit(0XFA); +send_ctrl_cmd_8bit(0XD4);send_data_cmd_8bit(0X3C); +send_ctrl_cmd_8bit(0XD5);send_data_cmd_8bit(0XC4); + +send_ctrl_cmd_8bit(0XE7);send_data_cmd_8bit(0X15); // 1/2/4/8 dot inversion => + + +send_ctrl_cmd_8bit(0XFB);send_data_cmd_8bit(0X3F); // VGH clamp voltage adjust + +//GAMMA R Setting +send_ctrl_cmd_8bit(0X24);send_data_cmd_8bit(0X00); +send_ctrl_cmd_8bit(0X25);send_data_cmd_8bit(0X11); +send_ctrl_cmd_8bit(0X26);send_data_cmd_8bit(0X2C); +send_ctrl_cmd_8bit(0X27);send_data_cmd_8bit(0X44); +send_ctrl_cmd_8bit(0X28);send_data_cmd_8bit(0X1B); +send_ctrl_cmd_8bit(0X29);send_data_cmd_8bit(0X30); +send_ctrl_cmd_8bit(0X2A);send_data_cmd_8bit(0X5F); +send_ctrl_cmd_8bit(0X2B);send_data_cmd_8bit(0X66); +send_ctrl_cmd_8bit(0X2D);send_data_cmd_8bit(0X1E); +send_ctrl_cmd_8bit(0X2F);send_data_cmd_8bit(0X24); +send_ctrl_cmd_8bit(0X30);send_data_cmd_8bit(0XB4); +send_ctrl_cmd_8bit(0X31);send_data_cmd_8bit(0X20); +send_ctrl_cmd_8bit(0X32);send_data_cmd_8bit(0X57); +send_ctrl_cmd_8bit(0X33);send_data_cmd_8bit(0X65); +send_ctrl_cmd_8bit(0X34);send_data_cmd_8bit(0XC3); +send_ctrl_cmd_8bit(0X35);send_data_cmd_8bit(0XD4); +send_ctrl_cmd_8bit(0X36);send_data_cmd_8bit(0XF0); +send_ctrl_cmd_8bit(0X37);send_data_cmd_8bit(0X7F); + +send_ctrl_cmd_8bit(0X38);send_data_cmd_8bit(0X00); +send_ctrl_cmd_8bit(0X39);send_data_cmd_8bit(0X11); +send_ctrl_cmd_8bit(0X3A);send_data_cmd_8bit(0X2C); +send_ctrl_cmd_8bit(0X3B);send_data_cmd_8bit(0X44); +send_ctrl_cmd_8bit(0X3D);send_data_cmd_8bit(0X1B); +send_ctrl_cmd_8bit(0X3F);send_data_cmd_8bit(0X30); +send_ctrl_cmd_8bit(0X40);send_data_cmd_8bit(0X5F); +send_ctrl_cmd_8bit(0X41);send_data_cmd_8bit(0X66); +send_ctrl_cmd_8bit(0X42);send_data_cmd_8bit(0X1E); +send_ctrl_cmd_8bit(0X43);send_data_cmd_8bit(0X24); +send_ctrl_cmd_8bit(0X44);send_data_cmd_8bit(0XB4); +send_ctrl_cmd_8bit(0X45);send_data_cmd_8bit(0X20); +send_ctrl_cmd_8bit(0X46);send_data_cmd_8bit(0X57); +send_ctrl_cmd_8bit(0X47);send_data_cmd_8bit(0X65); +send_ctrl_cmd_8bit(0X48);send_data_cmd_8bit(0XC3); +send_ctrl_cmd_8bit(0X49);send_data_cmd_8bit(0XD4); +send_ctrl_cmd_8bit(0X4A);send_data_cmd_8bit(0XF0); +send_ctrl_cmd_8bit(0X4B);send_data_cmd_8bit(0X7F); + +//GAMMA G Setting +send_ctrl_cmd_8bit(0X4C);send_data_cmd_8bit(0X00); +send_ctrl_cmd_8bit(0X4D);send_data_cmd_8bit(0X11); +send_ctrl_cmd_8bit(0X4E);send_data_cmd_8bit(0X2C); +send_ctrl_cmd_8bit(0X4F);send_data_cmd_8bit(0X44); +send_ctrl_cmd_8bit(0X50);send_data_cmd_8bit(0X1B); +send_ctrl_cmd_8bit(0X51);send_data_cmd_8bit(0X30); +send_ctrl_cmd_8bit(0X52);send_data_cmd_8bit(0X5F); +send_ctrl_cmd_8bit(0X53);send_data_cmd_8bit(0X66); +send_ctrl_cmd_8bit(0X54);send_data_cmd_8bit(0X1E); +send_ctrl_cmd_8bit(0X55);send_data_cmd_8bit(0X24); +send_ctrl_cmd_8bit(0X56);send_data_cmd_8bit(0XB4); +send_ctrl_cmd_8bit(0X57);send_data_cmd_8bit(0X20); +send_ctrl_cmd_8bit(0X58);send_data_cmd_8bit(0X57); +send_ctrl_cmd_8bit(0X59);send_data_cmd_8bit(0X65); +send_ctrl_cmd_8bit(0X5A);send_data_cmd_8bit(0XC3); +send_ctrl_cmd_8bit(0X5B);send_data_cmd_8bit(0XD4); +send_ctrl_cmd_8bit(0X5C);send_data_cmd_8bit(0XF0); +send_ctrl_cmd_8bit(0X5D);send_data_cmd_8bit(0X7F); + +send_ctrl_cmd_8bit(0X5E);send_data_cmd_8bit(0X00); +send_ctrl_cmd_8bit(0X5F);send_data_cmd_8bit(0X11); +send_ctrl_cmd_8bit(0X60);send_data_cmd_8bit(0X2C); +send_ctrl_cmd_8bit(0X61);send_data_cmd_8bit(0X44); +send_ctrl_cmd_8bit(0X62);send_data_cmd_8bit(0X1B); +send_ctrl_cmd_8bit(0X63);send_data_cmd_8bit(0X30); +send_ctrl_cmd_8bit(0X64);send_data_cmd_8bit(0X5F); +send_ctrl_cmd_8bit(0X65);send_data_cmd_8bit(0X66); +send_ctrl_cmd_8bit(0X66);send_data_cmd_8bit(0X1E); +send_ctrl_cmd_8bit(0X67);send_data_cmd_8bit(0X24); +send_ctrl_cmd_8bit(0X68);send_data_cmd_8bit(0XB4); +send_ctrl_cmd_8bit(0X69);send_data_cmd_8bit(0X20); +send_ctrl_cmd_8bit(0X6A);send_data_cmd_8bit(0X57); +send_ctrl_cmd_8bit(0X6B);send_data_cmd_8bit(0X65); +send_ctrl_cmd_8bit(0X6C);send_data_cmd_8bit(0XC3); +send_ctrl_cmd_8bit(0X6D);send_data_cmd_8bit(0XD4); +send_ctrl_cmd_8bit(0X6E);send_data_cmd_8bit(0XF0); +send_ctrl_cmd_8bit(0X6F);send_data_cmd_8bit(0X7F); + +//GAMMA B Setting +send_ctrl_cmd_8bit(0X70);send_data_cmd_8bit(0X00); +send_ctrl_cmd_8bit(0X71);send_data_cmd_8bit(0X11); +send_ctrl_cmd_8bit(0X72);send_data_cmd_8bit(0X2C); +send_ctrl_cmd_8bit(0X73);send_data_cmd_8bit(0X44); +send_ctrl_cmd_8bit(0X74);send_data_cmd_8bit(0X1B); +send_ctrl_cmd_8bit(0X75);send_data_cmd_8bit(0X30); +send_ctrl_cmd_8bit(0X76);send_data_cmd_8bit(0X5F); +send_ctrl_cmd_8bit(0X77);send_data_cmd_8bit(0X66); +send_ctrl_cmd_8bit(0X78);send_data_cmd_8bit(0X1E); +send_ctrl_cmd_8bit(0X79);send_data_cmd_8bit(0X24); +send_ctrl_cmd_8bit(0X7A);send_data_cmd_8bit(0XB4); +send_ctrl_cmd_8bit(0X7B);send_data_cmd_8bit(0X20); +send_ctrl_cmd_8bit(0X7C);send_data_cmd_8bit(0X57); +send_ctrl_cmd_8bit(0X7D);send_data_cmd_8bit(0X65); +send_ctrl_cmd_8bit(0X7E);send_data_cmd_8bit(0XC3); +send_ctrl_cmd_8bit(0X7F);send_data_cmd_8bit(0XD4); +send_ctrl_cmd_8bit(0X80);send_data_cmd_8bit(0XF0); +send_ctrl_cmd_8bit(0X81);send_data_cmd_8bit(0X7F); + +send_ctrl_cmd_8bit(0X82);send_data_cmd_8bit(0X00); +send_ctrl_cmd_8bit(0X83);send_data_cmd_8bit(0X11); +send_ctrl_cmd_8bit(0X84);send_data_cmd_8bit(0X2C); +send_ctrl_cmd_8bit(0X85);send_data_cmd_8bit(0X44); +send_ctrl_cmd_8bit(0X86);send_data_cmd_8bit(0X1B); +send_ctrl_cmd_8bit(0X87);send_data_cmd_8bit(0X30); +send_ctrl_cmd_8bit(0X88);send_data_cmd_8bit(0X5F); +send_ctrl_cmd_8bit(0X89);send_data_cmd_8bit(0X66); +send_ctrl_cmd_8bit(0X8A);send_data_cmd_8bit(0X1E); +send_ctrl_cmd_8bit(0X8B);send_data_cmd_8bit(0X24); +send_ctrl_cmd_8bit(0X8C);send_data_cmd_8bit(0XB4); +send_ctrl_cmd_8bit(0X8D);send_data_cmd_8bit(0X20); +send_ctrl_cmd_8bit(0X8E);send_data_cmd_8bit(0X57); +send_ctrl_cmd_8bit(0X8F);send_data_cmd_8bit(0X65); +send_ctrl_cmd_8bit(0X90);send_data_cmd_8bit(0XC3); +send_ctrl_cmd_8bit(0X91);send_data_cmd_8bit(0XD4); +send_ctrl_cmd_8bit(0X92);send_data_cmd_8bit(0XF0); +send_ctrl_cmd_8bit(0X93);send_data_cmd_8bit(0X7F); + +//=== Timing === +send_ctrl_cmd_8bit(0X94);send_data_cmd_8bit(0X1C); +send_ctrl_cmd_8bit(0X95);send_data_cmd_8bit(0X1C); +send_ctrl_cmd_8bit(0X96);send_data_cmd_8bit(0X03); +send_ctrl_cmd_8bit(0X97);send_data_cmd_8bit(0X01); +send_ctrl_cmd_8bit(0X98);send_data_cmd_8bit(0X2A); +send_ctrl_cmd_8bit(0X99);send_data_cmd_8bit(0X25); +send_ctrl_cmd_8bit(0X9A);send_data_cmd_8bit(0X49); +send_ctrl_cmd_8bit(0X9B);send_data_cmd_8bit(0X03); +send_ctrl_cmd_8bit(0X9C);send_data_cmd_8bit(0X17); +send_ctrl_cmd_8bit(0X9D);send_data_cmd_8bit(0X1C); +send_ctrl_cmd_8bit(0X9E);send_data_cmd_8bit(0X9B); +send_ctrl_cmd_8bit(0X9F);send_data_cmd_8bit(0X00); +send_ctrl_cmd_8bit(0XA0);send_data_cmd_8bit(0X02); + + +//CMD1 +send_ctrl_cmd_8bit(0XFF);send_data_cmd_8bit(0XAA); +send_ctrl_cmd_8bit(0X11); +MDELAY(300); +send_ctrl_cmd_8bit(0XF3);send_data_cmd_8bit(0XAA); +send_ctrl_cmd_8bit(0X00);send_data_cmd_8bit(0X01); +send_ctrl_cmd_8bit(0X2D);send_data_cmd_8bit(0X84); +send_ctrl_cmd_8bit(0X7F);send_data_cmd_8bit(0XAA); +send_ctrl_cmd_8bit(0X29); +} + + +//punk, end + + +typedef enum +{ + USER_CMD_SET=0x00, + MANUFACTURE_CMD_SET_PAGE0=0x80, + MANUFACTURE_CMD_SET_PAGE1=0xC0, +}ILI7800_CMD_TYPE; + +static __inline void send_ctrl_cmd(ILI7800_CMD_TYPE type,unsigned int cmd) +{ + unsigned char high_8bit = cmd&0x00FF; + unsigned char low_8bit = type; + spi_send_data(0x2000|high_8bit); + spi_send_data(0x0000|low_8bit); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned char low_8bit = data&0x00FF; + spi_send_data(0x4000|low_8bit); +} +static __inline void set_lcm_register(ILI7800_CMD_TYPE type,unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(type,regIndex); + send_data_cmd(regData); +} + +//static __inline void backlight_ctrl(unsigned char cmd) +//{ +// return; +//} + +static void init_lcm_registers(void) +{ +/********************************************** +module factory:huashi +resolution:480*800(WVGA) +customer:xinya +**********************************************/ +//IM[4-0]=10100b + set_lcm_register(USER_CMD_SET,0xF3,0xAA); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x00,0x01); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE1,0x2D,0x84); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE1,0xC4,0x50); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE1,0x15,0x20); + MDELAY(200); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE1,0x00,0x00); + + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x01,0x64); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x02,0x22); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x03,0x44); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x04,0x2B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x05,0x2B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x06,0x2B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x08,0x33); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x09,0x12); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x0A,0x33); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x0C,0x12); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x0F,0x12); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x12,0x07); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x13,0x11); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x14,0x40); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x15,0x4A); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x16,0x6E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x1C,0xFD); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x1D,0x01); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x1E,0x0B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xA3,0xFA); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xA4,0x3C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xA5,0xC4); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xA6,0x05); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xD3,0xFA); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xD4,0x3C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xD5,0xC4); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xE7,0x05); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xFB,0x3F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x24,0x00); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x25,0x10); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x26,0x32); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x27,0x45); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x28,0x1B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x29,0x2E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x2A,0x5E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x2B,0x5C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x2D,0x20); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x2F,0x25); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x30,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x31,0x1A); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x32,0x49); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x33,0x5F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x34,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x35,0xB8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x36,0xC8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x37,0x7F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x38,0x00); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x39,0x10); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x3A,0x32); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x3B,0x45); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x3D,0x1B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x3F,0x2E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x40,0x5E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x41,0x5C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x42,0x20); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x43,0x25); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x44,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x45,0x1A); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x46,0x49); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x47,0x5F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x48,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x49,0xB8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x4A,0xC8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x4B,0x7F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x4C,0x00); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x4D,0x10); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x4E,0x32); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x4F,0x45); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x50,0x1B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x51,0x2E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x52,0x5E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x53,0x5C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x54,0x20); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x55,0x25); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x56,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x57,0x1A); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x58,0x49); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x59,0x5F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x5A,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x5B,0xB8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x5C,0xC8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x5D,0x7F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x5E,0x00); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x5F,0x10); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x60,0x32); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x61,0x45); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x62,0x1B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x63,0x2E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x64,0x5E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x65,0x5C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x66,0x20); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x67,0x25); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x68,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x69,0x1A); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x6A,0x49); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x6B,0x5F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x6C,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x6D,0xB8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x6E,0xC8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x6F,0x7F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x70,0x00); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x71,0x10); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x72,0x32); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x73,0x45); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x74,0x1B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x75,0x2E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x76,0x5E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x77,0x5C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x78,0x20); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x79,0x25); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x7A,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x7B,0x1A); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x7C,0x49); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x7D,0x5F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x7E,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x7F,0xB8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x80,0xC8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x81,0x7F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x82,0x00); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x83,0x10); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x84,0x32); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x85,0x45); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x86,0x1B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x87,0x2E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x88,0x5E); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x89,0x5C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x8A,0x20); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x8B,0x25); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x8C,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x8D,0x1A); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x8E,0x49); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x8F,0x5F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x90,0xA3); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x91,0xB8); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x92,0xCA); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x93,0x7F); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x94,0x1C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x95,0x1C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x96,0x03); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x97,0x01); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x98,0x2A); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x99,0x25); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x9A,0x49); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x9B,0x03); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x9C,0x17); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x9D,0x1C); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x9E,0x9B); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0x9F,0x00); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xA0,0x02); + set_lcm_register(MANUFACTURE_CMD_SET_PAGE0,0xFF,0xAA); + send_ctrl_cmd(USER_CMD_SET,0x11); + MDELAY(120); + send_ctrl_cmd(USER_CMD_SET,0x29); +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + //lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + //lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ +#ifdef BUILD_UBOOT + printf("punk,UBOOT lcm_set_util_funcs\r\n"); +#else + printk("punk,kennel lcm_get_params\r\n"); +#endif + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ +#ifdef BUILD_UBOOT + printf("punk,UBOOT lcm_get_params\r\n"); +#else + printk("punk,kennel lcm_get_params\r\n"); +#endif + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 40; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 6; + params->dpi.hsync_back_porch = 27; + params->dpi.hsync_front_porch = 27; + params->dpi.vsync_pulse_width = 6; + params->dpi.vsync_back_porch = 27; + params->dpi.vsync_front_porch = 27; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; +} + +static void lcm_init(void) +{ +#ifdef BUILD_UBOOT + printf("punk,UBOOT lcm_init\r\n"); +#else + printk("punk,kennel lcm_init\r\n"); +#endif + config_gpio(); + + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(150); +#ifdef ILI7800_SPI_8BIT + init_lcm_registers_8bit(); +#else + init_lcm_registers(); + xx +#endif + //backlight +} + + +#ifdef ILI7800_SPI_8BIT + +static void lcm_suspend_8bit(void) +{ + + send_ctrl_cmd_8bit(0x28); + send_ctrl_cmd_8bit(0x10); + MDELAY(120); +} + +#else +xx +static void lcm_suspend(void) +{ + send_ctrl_cmd_8bit(USER_CMD_SET,0x28); + send_ctrl_cmd_8bit(USER_CMD_SET,0x10); + MDELAY(120); +} +#endif + + +#ifdef ILI7800_SPI_8BIT + +static void lcm_resume_8bit(void) +{ + + send_ctrl_cmd_8bit(0x11); + MDELAY(120); + send_ctrl_cmd_8bit(0x29); +} + +#else +xx +static void lcm_resume(void) +{ + send_ctrl_cmd(USER_CMD_SET,0x11); + MDELAY(120); + send_ctrl_cmd(USER_CMD_SET,0x29); + //backlight_ctrl(1); +} +#endif + + +static void lcm_setbacklight(unsigned int level) +{ +// unsigned int level_new; +// level_new=(level<<1)/3; +// backlight_ctrl(level_new); + backlight_ctrl(level); +} + + +static unsigned int lcm_compare_id(void) +{ + unsigned int id[3]; + SET_RESET_PIN(1); + MDELAY(20); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(50); + spi_read_reg(0x04,3,id); +#ifdef BUILD_UBOOT + printf("punk,uboot lcm_compare_id, id[0]=%x,id[1]=%x,id[2]=%x\r\n",id[0],id[1],id[2]); +#else + printk("punk,kernel lcm_compare_id, id[0]=%x,id[1]=%x,id[2]=%x\r\n",id[0],id[1],id[2]); +#endif + //return (LCM_ID == read_data_cmd())?1:0; + return 1; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER yt50f23c0_wvga_ili7800_lcm_drv = +{ + .name = "ili7800", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, +#ifdef ILI7800_SPI_8BIT + .suspend = lcm_suspend_8bit, + .resume = lcm_resume_8bit, +#else + xx + .suspend = lcm_suspend, + .resume = lcm_resume, +#endif + + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id, +}; + + + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/bm8578/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/bm8578/lcm_drv.c new file mode 100755 index 0000000..b726e6e --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/bm8578/lcm_drv.c @@ -0,0 +1,264 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/dummy/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/dummy/lcm_drv.c new file mode 100755 index 0000000..03cae44 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/dummy/lcm_drv.c @@ -0,0 +1,112 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/ili9338/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/ili9338/lcm_drv.c new file mode 100755 index 0000000..08c2fa1 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/ili9338/lcm_drv.c @@ -0,0 +1,417 @@ + + + +#include +#include "lcm_drv.h" + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) + +static LCM_UTIL_FUNCS lcm_util = { 0 }; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +static int lcm_id = 1; + + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +const unsigned int lcm_id_detect(void) +{ + int id; + + send_ctrl_cmd(0xDA); + lcm_util.read_data(); + id = lcm_util.read_data(); + + if (id == 84) + return 0; + else { //the driver can't probe ili tft lcd. + lcm_id = 0; + return 1; + } +} + + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS * util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS * params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; /// LCM_COLOR_ORDER_BGR; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; /// LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if 1 + /* + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; + */ + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 5; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 10; +#else + params->dbi.parallel.write_setup = 10; + params->dbi.parallel.write_hold = 13; + params->dbi.parallel.write_wait = 13; + params->dbi.parallel.read_setup = 12; + params->dbi.parallel.read_latency = 29; + params->dbi.parallel.wait_period = 10; +#endif +} + +static void init_lcm_ili_registers(void) +{ + send_ctrl_cmd(0x11); + MDELAY(100); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x06); + + send_ctrl_cmd(0xCB); + send_data_cmd(0x01); + + send_ctrl_cmd(0xC0); + send_data_cmd(0x26); + send_data_cmd(0x01); + + send_ctrl_cmd(0xC1); + send_data_cmd(0x44); + + send_ctrl_cmd(0xC5); + send_data_cmd(0x2d); + send_data_cmd(0x38); + + send_ctrl_cmd(0xC7); + send_data_cmd(0xC4); + + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB1); + send_data_cmd(0x00); + send_data_cmd(0x11); + + send_ctrl_cmd(0x36); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB6); + send_data_cmd(0x0A); + send_data_cmd(0x22); + send_data_cmd(0x27); + + send_ctrl_cmd(0xE0); + send_data_cmd(0x1F); + send_data_cmd(0x18); + send_data_cmd(0x16); + send_data_cmd(0x08); + send_data_cmd(0x10); + send_data_cmd(0x08); + send_data_cmd(0x45); + send_data_cmd(0x9B); + send_data_cmd(0x34); + send_data_cmd(0x2A); + send_data_cmd(0x0F); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x00); + + send_ctrl_cmd(0XE1); + send_data_cmd(0x00); + send_data_cmd(0x27); + send_data_cmd(0x29); + send_data_cmd(0x08); + send_data_cmd(0x0F); + send_data_cmd(0x07); + send_data_cmd(0x3A); + send_data_cmd(0x46); + send_data_cmd(0x4B); + send_data_cmd(0x15); + send_data_cmd(0x10); + send_data_cmd(0x08); + send_data_cmd(0x38); + send_data_cmd(0x38); + send_data_cmd(0x1F); + + send_ctrl_cmd(0x29); + MDELAY(120); +} + +static void init_lcm_himax_registers(void) +{ + //driving ability setting + set_lcm_register(0xEA, 0x00); //PTBA[15:8] + set_lcm_register(0xEB, 0x20); //PTBA[7:0] + set_lcm_register(0xEC, 0x0C); //STBA[15:8] + set_lcm_register(0xED, 0xC4); //STBA[7:0] + set_lcm_register(0xE8, 0x40); //OPON[7:0] + set_lcm_register(0xE9, 0x38); //OPON1[7:0] + set_lcm_register(0xF1, 0x01); //OTPS1B + set_lcm_register(0xF2, 0x10); //GEN + set_lcm_register(0x27, 0xA3); + + //gamma 2.2 setting + set_lcm_register(0x40, 0x00); + set_lcm_register(0x41, 0x00); + set_lcm_register(0x42, 0x01); + set_lcm_register(0x43, 0x13); + set_lcm_register(0x44, 0x10); + set_lcm_register(0x45, 0x26); + set_lcm_register(0x46, 0x08); + set_lcm_register(0x47, 0x51); + set_lcm_register(0x48, 0x02); + set_lcm_register(0x49, 0x12); + set_lcm_register(0x4A, 0x18); + set_lcm_register(0x4B, 0x19); + set_lcm_register(0x4C, 0x14); + + set_lcm_register(0x50, 0x19); + set_lcm_register(0x51, 0x2F); + set_lcm_register(0x52, 0x2C); + set_lcm_register(0x53, 0x3E); + set_lcm_register(0x54, 0x3F); + set_lcm_register(0x55, 0x3F); + set_lcm_register(0x56, 0x2E); + set_lcm_register(0x57, 0x77); + set_lcm_register(0x58, 0x0B); + set_lcm_register(0x59, 0x06); + set_lcm_register(0x5A, 0x07); + set_lcm_register(0x5B, 0x0D); + set_lcm_register(0x5C, 0x1D); + set_lcm_register(0x5D, 0xCC); + + //power voltage setting + set_lcm_register(0x1B, 0x1B); //VRH=4.65V/VREG1 Voltage + set_lcm_register(0x1A, 0x01); //BT (VGH~15V,VGL~-10V,DDVDH~5V)/0X05(VGH~15v,VGL~-5V,DDVDH~5) + set_lcm_register(0x24, 0x37); //VMH(VCOM High voltage ~3.2V)/VCOMH\u8983\u8ab9 + set_lcm_register(0x25, 0x59); //VML(VCOM Low voltage -1.2V)\ufe5cVCOML\u8983\u8ab9 + + //VCOM offset + set_lcm_register(0x23, 0x86); //for flicker adjust //can reload from OTP + + //power on setting + set_lcm_register(0x18, 0x39); //I/P_RADJ,N/P_RADJ, Normal mode 150Hz + set_lcm_register(0x19, 0x01); //OSC_EN='1', start Osc/osc internal + set_lcm_register(0x01, 0x00); //DP_STB='0', out deep sleep + set_lcm_register(0x1F, 0x88); // GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=0 + MDELAY(5); + set_lcm_register(0x1F, 0x80); // GAS=1, VOMG=00, PON=0, DK=0, XDK=0, DVDH_TRI=0, STB=0 + MDELAY(5); + set_lcm_register(0x1F, 0x90); // GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0 + MDELAY(5); + set_lcm_register(0x1F, 0xD0); // GAS=1, VOMG=10, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0 + MDELAY(5); + + //18bBit/pixel 16-bits data bus + set_lcm_register(0x17, 0x07); //default 0x06 262k color // 0x05 65k color/0x07\u5c8618bit/pixel 16-bits data bus + + //set panel + set_lcm_register(0x36, 0x00); //SS_P, GS_P,REV_P,BGR_P + + //display on setting + set_lcm_register(0x28, 0x38); //GON=1, DTE=1, D=1000/source=PT + MDELAY(40); + set_lcm_register(0x28, 0x3C); //GON=1, DTE=1, D=1100/source=display + + //set GRAM area + set_lcm_register(0x02, 0x00); + set_lcm_register(0x03, 0x00); //column start + set_lcm_register(0x04, 0x00); + set_lcm_register(0x05, 0xEF); //column end + set_lcm_register(0x06, 0x00); + set_lcm_register(0x07, 0x00); //row start + set_lcm_register(0x08, 0x01); + set_lcm_register(0x09, 0x3F); //row end + + send_ctrl_cmd(0x22); //start GRAM write +} + +static void lcm_ili_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_ili_registers(); +} + +static void lcm_himax_init(void) +{ + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_himax_registers(); +} + +static void lcm_ili_suspend(void) +{ + send_ctrl_cmd(0x28); + send_ctrl_cmd(0x10); + MDELAY(120); +} + +static void lcm_himax_suspend(void) +{ + set_lcm_register(0x28, 0xB8); //GON=\uff0a1\uff0a DTE=\uff0a1\uff0a D[1:0]=\uff0a10\uff0a + MDELAY(40); + set_lcm_register(0x1F, 0x89); // GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=1 + MDELAY(40); + set_lcm_register(0x28, 0x04); //GON=\uff0a0\uff0a DTE=\uff0a0\uff0a D[1:0]=\uff0a01\uff0a + MDELAY(40); + set_lcm_register(0x28, 0x24); //GON=\uff0a1 DTE=\uff0a0\uff0a D[1:0]=\uff0a01\uff0a + MDELAY(40); + set_lcm_register(0x19, 0x00); //OSC_EN=\uff0a0\uff0a + MDELAY(5); +} + +static void lcm_ili_resume(void) +{ + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_ili_registers(); +} + +static void lcm_himax_resume(void) +{ + set_lcm_register(0x18, 0x39); //I/P_RADJ,N/P_RADJ, Normal mode 75Hz + set_lcm_register(0x19, 0x01); //OSC_EN='1', start Osc + set_lcm_register(0x1F, 0x88); // GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=0 + MDELAY(5); + set_lcm_register(0x1F, 0x80); // GAS=1, VOMG=00, PON=0, DK=0, XDK=0, DVDH_TRI=0, STB=0 + MDELAY(5); + set_lcm_register(0x1F, 0x90); // GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0 + MDELAY(5); + set_lcm_register(0x1F, 0xD0); // GAS=1, VOMG=10, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0 + MDELAY(5); + set_lcm_register(0x28, 0x38); //GON=1, DTE=1, D=1000 + MDELAY(40); + set_lcm_register(0x28, 0x3C); //GON=1, DTE=1, D=1100 +} + +static void lcm_ili_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd((x0 >> 8) & 0xFF); + send_data_cmd(x0 & 0xFF); + send_data_cmd((x1 >> 8) & 0xFF); + send_data_cmd(x1 & 0xFF); + + send_ctrl_cmd(0x2B); + send_data_cmd((y0 >> 8) & 0xFF); + send_data_cmd(y0 & 0xFF); + send_data_cmd((y1 >> 8) & 0xFF); + send_data_cmd(y1 & 0xFF); + + send_ctrl_cmd(0x2C); +} + +static void lcm_himax_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x02); + send_data_cmd((x0 >> 8) & 0xFF); + send_ctrl_cmd(0x03); + send_data_cmd(x0 & 0xFF); + send_ctrl_cmd(0x04); + send_data_cmd((x1 >> 8) & 0xFF); + send_ctrl_cmd(0x05); + send_data_cmd(x1 & 0xFF); + + send_ctrl_cmd(0x06); + send_data_cmd((y0 >> 8) & 0xFF); + send_ctrl_cmd(0x07); + send_data_cmd(y0 & 0xFF); + send_ctrl_cmd(0x08); + send_data_cmd((y1 >> 8) & 0xFF); + send_ctrl_cmd(0x09); + send_data_cmd(y1 & 0xFF); + + send_ctrl_cmd(0x22); +} + +const LCM_DRIVER *LCM_GetDriver() +{ + static const LCM_DRIVER LCM_ILI_DRV = { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_ili_init, + .suspend = lcm_ili_suspend, + .resume = lcm_ili_resume, + .update = lcm_ili_update + }; + return &LCM_ILI_DRV; +} + +const LCM_DRIVER *LCM_GetJrdDriver() +{ + static const LCM_DRIVER LCM_HIMAX_DRV = { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_himax_init, + .suspend = lcm_himax_suspend, + .resume = lcm_himax_resume, + .update = lcm_himax_update + }; + return &LCM_HIMAX_DRV; +} \ No newline at end of file diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/ili9481/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/ili9481/lcm_drv.c new file mode 100755 index 0000000..7ba0fd4 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/ili9481/lcm_drv.c @@ -0,0 +1,243 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // AUO 3.17" + ILI9481 + + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); + send_data_cmd(0X0007); + send_data_cmd(0X0041); + send_data_cmd(0X001B); + + send_ctrl_cmd(0X00D1); + send_data_cmd(0X0000); + send_data_cmd(0X0016); // 0x001b + send_data_cmd(0X0012); + + send_ctrl_cmd(0X00D2); + send_data_cmd(0X0001); + send_data_cmd(0X0011); + + send_ctrl_cmd(0X00C0); + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X00F3); + send_data_cmd(0X0040); + send_data_cmd(0X000A); + send_ctrl_cmd(0X00F6); + send_data_cmd(0X0080); + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0080); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x29); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/inc/lcm_drv.h b/alcatel_ot_890d_jrd16_a10x/lcm/inc/lcm_drv.h new file mode 100755 index 0000000..0e5ff18 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/inc/lcm_drv.h @@ -0,0 +1,313 @@ + + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = 0, + LCM_DRIVING_CURRENT_4MA, + LCM_DRIVING_CURRENT_2MA, + LCM_DRIVING_CURRENT_SLEW_CNTL +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_latency; + unsigned int wait_period; +} LCM_DBI_PARALLEL_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned char pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- +const unsigned int lcm_id_detect(void); +int lcm_module_init(void); +const LCM_DRIVER* LCM_GetDriver(void); +const LCM_DRIVER* LCM_GetJrdDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/lg4571/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/lg4571/lcm_drv.c new file mode 100755 index 0000000..3eecd23 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/lg4571/lcm_drv.c @@ -0,0 +1,344 @@ + + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#ifdef CONFIG_FB_MT6516_SIMULATE_MULTIPLE_RESOLUTIONS_ON_OPPO +#define FRAME_WIDTH (CONFIG_FB_MT6516_OPPO_SIMUL_WIDTH) +#define FRAME_HEIGHT (CONFIG_FB_MT6516_OPPO_SIMUL_HEIGHT) +#else +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/mtk_cust.mk b/alcatel_ot_890d_jrd16_a10x/lcm/mtk_cust.mk new file mode 100755 index 0000000..48c1fe1 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/mtk_cust.mk @@ -0,0 +1,2 @@ +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/nt35582/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/nt35582/lcm_drv.c new file mode 100755 index 0000000..02628a8 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/nt35582/lcm_drv.c @@ -0,0 +1,299 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/s6d0170/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/s6d0170/lcm_drv.c new file mode 100755 index 0000000..ec00b50 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/s6d0170/lcm_drv.c @@ -0,0 +1,285 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (432) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/spfd5461a/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/spfd5461a/lcm_drv.c new file mode 100755 index 0000000..36d128a --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/spfd5461a/lcm_drv.c @@ -0,0 +1,346 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/ta7601/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/ta7601/lcm_drv.c new file mode 100755 index 0000000..d0399ca --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/ta7601/lcm_drv.c @@ -0,0 +1,269 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_890d_jrd16_a10x/lcm/tft1p3037/lcm_drv.c b/alcatel_ot_890d_jrd16_a10x/lcm/tft1p3037/lcm_drv.c new file mode 100755 index 0000000..5c7dca2 --- /dev/null +++ b/alcatel_ot_890d_jrd16_a10x/lcm/tft1p3037/lcm_drv.c @@ -0,0 +1,307 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0001); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_903d_jrd73_gb/lcm/bm8578/bm8578.c b/alcatel_ot_903d_jrd73_gb/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..e7283e3 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/bm8578/bm8578.c @@ -0,0 +1,271 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/dummy/dummy.c b/alcatel_ot_903d_jrd73_gb/lcm/dummy/dummy.c new file mode 100644 index 0000000..9e80fd4 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/dummy/dummy.c @@ -0,0 +1,112 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_903d_jrd73_gb/lcm/hx8357B/hx8357b.c b/alcatel_ot_903d_jrd73_gb/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..10df35a --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/hx8357B/hx8357b.c @@ -0,0 +1,407 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8357) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +#if 0 + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +#else + MDELAY(10); + send_ctrl_cmd(0x11);//Sleep Out + MDELAY(120); + + send_ctrl_cmd(0xEE);//Set EQ + send_data_cmd(0x02); + send_data_cmd(0x01); + send_data_cmd(0x02); + send_data_cmd(0x01); + + send_ctrl_cmd(0xED);//Set DIR TIM + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x9A); + send_data_cmd(0x9A); + send_data_cmd(0x9B); + send_data_cmd(0x9B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x01); + send_data_cmd(0xA2); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB4);//Set RM, DM + send_data_cmd(0x00);// + + send_ctrl_cmd(0xC0); //Set Panel Driving + send_data_cmd(0x10); //REV SM GS + send_data_cmd(0x3B); // NL[5:0] + send_data_cmd(0x00); //SCN[6:0] + send_data_cmd(0x02); //NDL 0 PTS[2:0] + send_data_cmd(0x11); //PTG ISC[3:0] + + send_ctrl_cmd(0xC8);//Set Gamma + send_data_cmd(0x00); //KP1,KP0 + send_data_cmd(0x46); //KP3,KP2 + send_data_cmd(0x12); //KP5,KP4 + send_data_cmd(0x20); //RP1,RP0 + send_data_cmd(0x0c); //VRP0 01 + send_data_cmd(0x00); //VRP1 + send_data_cmd(0x56); //KN1,KN0 + send_data_cmd(0x12); //KN3,KN2 + send_data_cmd(0x67); //KN5,KN4 + send_data_cmd(0x02); //RN1,RN0 + send_data_cmd(0x00); //VRN0 + send_data_cmd(0x0c); //VRN1 01 + + send_ctrl_cmd(0xD0);//Set Power + send_data_cmd(0x44);//DDVDH :5.28 + send_data_cmd(0x44); // BT VGH:15.84 VGL:-7.92 + send_data_cmd(0x05);//VREG1 4.625V + + send_ctrl_cmd(0xD1);//Set VCOM + send_data_cmd(0x4b); //VCOMH 3.367 //3B + send_data_cmd(0x14);//VCOM 5.2725 + + send_ctrl_cmd(0xD2); + send_data_cmd(0x04); + send_data_cmd(0x22); //12 + + send_ctrl_cmd(0xD3); + send_data_cmd(0x04); + send_data_cmd(0x12); + + send_ctrl_cmd(0xD4); + send_data_cmd(0x07); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x00); + + send_ctrl_cmd(0xC5); //Set Frame rate + send_data_cmd(0x08); //61.51Hz + + + send_ctrl_cmd(0X0036); + send_data_cmd(0X000a); + + send_ctrl_cmd(0X003A); + send_data_cmd(0X0006); + + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00E0); + MDELAY(120); + + send_ctrl_cmd(0x29); //Display On + MDELAY(5); +#endif +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id; + send_ctrl_cmd(0xBF); // SET password + read_data_cmd(); //dummy read + read_data_cmd(); //01 + read_data_cmd(); //62 + id= read_data_cmd(); //83 + id= ( id<< 8 ) | read_data_cmd(); //57 + read_data_cmd(); //ff + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + //.set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/hx8369/hx8369.c b/alcatel_ot_903d_jrd73_gb/lcm/hx8369/hx8369.c new file mode 100644 index 0000000..f061796 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/hx8369/hx8369.c @@ -0,0 +1,533 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +#if defined(LCM_DSI_CMD_MODE) + { + data_array[0]=0x00043902; + data_array[1]=0x6983FFB9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00103902; + data_array[1]=0x032000B2; + data_array[2]=0xFF007003; + data_array[3]=0x00000000; + data_array[4]=0x01000303; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0]=0x00063902; + data_array[1]=0x700800B4; + data_array[2]=0x0000060E; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; + data_array[1] = 0x030100D5; + data_array[2] = 0x08020100; + data_array[3] = 0x00131180; + data_array[4] = 0x51064000; + data_array[5] = 0x71000007; + data_array[6] = 0x07046005; + data_array[7] = 0x0000060F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00143902; + data_array[1] = 0x340085B1; + data_array[2] = 0x0E0E0006; + data_array[3] = 0x1A1A2C24; + data_array[4] = 0xE6013A07; + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + // color format + { + // RGB565 + //data_array[0] = 0x053A1500; + // RGB666 + //data_array[0] = 0x063A1500; + // RGB888 + data_array[0] = 0x073A1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } + + data_array[0] = 0x02CC1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00033902; + data_array[1] = 0x006C6CB6 ; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + // ENABLE FMARK + //data_array[0] = 0x00023902; + //data_array[1] = 0x00000035 ; + //dsi_set_cmdq(&data_array, 2, 1); + //MDELAY(10); + + //data_array[0] = 0x00351500; + //dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(10); + + // SET GAMMA + data_array[0] = 0x00233902; + data_array[1] = 0x140C00E0; + data_array[2] = 0x293F3F3F; + data_array[3] = 0x0F0C0654; + data_array[4] = 0x15131513; + data_array[5] = 0x0C001F14; + data_array[6] = 0x3F3F3F14; + data_array[7] = 0x0C065429; + data_array[8] = 0x1315130F; + data_array[9] = 0x001F1415; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + + data_array[0] = 0x000E3902; //// SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA ; + data_array[2] = 0x10000A00 ; + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018 ; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + } +#else + { + data_array[0] = 0x00043902; // SET password + data_array[1] = 0x6983FFB9; // + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x00143902; //// SET Power + data_array[1] = 0x340085B1; // + data_array[2] = 0x0F0F0007; // + data_array[3] = 0x3F3F322A; // + data_array[4] = 0xE6013A01; // + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + data_array[0] = 0x00103902; //// SET Display 480x800 + data_array[1] = 0x032300B2; // + data_array[2] = 0xFF007003; // + data_array[3] = 0x00000000; // + data_array[4] = 0x01000303; // + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00063902; // SET Display + data_array[1] = 0x801800B4; + data_array[2] = 0x00000206; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x00033902; //// SET VCOM + data_array[1] = 0x004242B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; //// SET GIP + data_array[1] = 0x030400D5; + data_array[2] = 0x28050100; + data_array[3] = 0x00030170; + data_array[4] = 0x51064000; + data_array[5] = 0x41000007; + data_array[6] = 0x07075006; + data_array[7] = 0x0000040F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00233902; //// SET GAMMA + data_array[1] = 0x191300E0; // + data_array[2] = 0x283F3D38; // + data_array[3] = 0x0E0D0746; // + data_array[4] = 0x14121512; // + data_array[5] = 0x1300170F; + data_array[6] = 0x3F3D3819; + data_array[7] = 0x0D074628; + data_array[8] = 0x1215120E; + data_array[9] = 0x00170F14; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + +#if 0 + switch(g_ColorFormat) + { + case PACKED_RGB565: + data_array[0] = 0x553A1500; // SET pixel format + break; + + case LOOSED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + case PACKED_RGB888: + data_array[0] = 0x773A1500; // SET pixel format + break; + + case PACKED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + default: + //dbg_print("Format setting error \n\r"); + while(1); + break; + } + + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +#endif + data_array[0] = 0x000E3902; // SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA; // + data_array[2] = 0x10000A00; // + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } +#endif + //------------------------------------------------------------------------ + // LUT for HX8369 + //------------------------------------------------------------------------ + if (1)//(g_ColorFormat==0) + { + data_array[0] = 0x00C13902; //Set Color LUT 1 + data_array[1] = 0x1008002D; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000FF; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT 2 + data_array[1] = 0x08040000; + data_array[2] = 0x1814100C; + data_array[3] = 0x2824201C; + data_array[4] = 0x3834302C; + data_array[5] = 0x4844403C; + data_array[6] = 0x5854504C; + data_array[7] = 0x6864605C; + data_array[8] = 0x7874706C; + data_array[9] = 0x8884807C; + data_array[10] = 0x9894908C; + data_array[11] = 0xA8A4A09C; + data_array[12] = 0xB8B4B0AC; + data_array[13] = 0xC8C4C0BC; + data_array[14] = 0xD8D4D0CC; + data_array[15] = 0xE8E4E0DC; + dsi_set_cmdq(&data_array, 16, 1); + + MDELAY(10); + + data_array[0] = 0xF8F4F0EC; //Set Color LUT 3 + data_array[1] = 0x100800FC; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000F8; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT + data_array[1] = 0x00000000; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + } + +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // DBI + //params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // DPI + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.intermediat_buffer_num = 2; + + // DSI + params->dsi.DSI_WMEM_CONTI=0x3C; + params->dsi.DSI_RMEM_CONTI=0x3E; + //params->dsi.LANE_NUM=LCM_ONE_LANE; + params->dsi.LANE_NUM=LCM_TWO_LANE; + params->dsi.VC_NUM=0x0; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + params->dsi.HS_TRAIL=0x14; + params->dsi.HS_ZERO=0x14; + params->dsi.HS_PRPR=0x0A; + params->dsi.LPX=0x05; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x37; + params->dsi.TA_SURE=0x16; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x14; + params->dsi.CLK_ZERO=0x14; + params->dsi.LPX_WAIT=0x0A; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x0A; + + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + + //params->dsi.pll_div2=4; // div2=0~15: fout=fvo/(2*div2) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + //data_array[6]= 0x002c3901; + + dsi_set_cmdq(&data_array, 7, 0); + +} + +LCM_DRIVER hx8369_dsi_lcm_drv = +{ + .name = "hx8369_dsi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if defined(LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif + }; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c b/alcatel_ot_903d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c new file mode 100644 index 0000000..34e001e --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c @@ -0,0 +1,573 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x9329) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xCF); + send_data_cmd(0x00); + send_data_cmd(0x21); + + send_ctrl_cmd(0xB4); + send_data_cmd(0x02); + + send_ctrl_cmd(0xC0); //VREG1OUT + send_data_cmd(0x0d); + send_data_cmd(0x0f); + + send_ctrl_cmd(0xC1); //ddcdh/vgl.vgh + send_data_cmd(0x01); + + send_ctrl_cmd(0x36); + send_data_cmd(0x08); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x06); + + send_ctrl_cmd(0xB6); //Display Function Control + send_data_cmd(0x0A); + send_data_cmd(0x82); + + send_ctrl_cmd(0xC5); //VCOM + send_data_cmd(0xED); //VCOMH + + send_ctrl_cmd(0xE8); + send_data_cmd(0x84); + send_data_cmd(0x1A); + send_data_cmd(0x18); + + send_ctrl_cmd(0xE0); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x06); + send_data_cmd(0x0c); + send_data_cmd(0x36); + send_data_cmd(0x88); + send_data_cmd(0x46); + send_data_cmd(0x08); + send_data_cmd(0x0e); + send_data_cmd(0x0b); + send_data_cmd(0x18); + send_data_cmd(0x1a); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE1); + send_data_cmd(0x0f); + send_data_cmd(0x26); + send_data_cmd(0x27); + send_data_cmd(0x03); + send_data_cmd(0x11); + send_data_cmd(0x07); + send_data_cmd(0x39); + send_data_cmd(0x47); + send_data_cmd(0x49); + send_data_cmd(0x03); + send_data_cmd(0x09); + send_data_cmd(0x0c); + send_data_cmd(0x2e); + send_data_cmd(0x3f); + send_data_cmd(0x0f); + + send_ctrl_cmd(0x2A); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xEF); + + send_ctrl_cmd(0x2B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0xF6); + send_data_cmd(0x41); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB7); + send_data_cmd(0x06); + + send_ctrl_cmd(0xB1); + send_data_cmd(0x00); + send_data_cmd(0x15); + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2c); //memory write + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + params->dbi.te_mode= 1;//libin changed + params->dbi.te_edge_polarity= 1; + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 3; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(100); + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(150); + send_ctrl_cmd(0x29); + MDELAY(50); + send_ctrl_cmd(0x2c); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id=0; + + send_ctrl_cmd(0xD3); + + read_data_cmd(); //dummy code:0 + + read_data_cmd(); // 0x00 + + unsigned int param1 = 0; + param1 =read_data_cmd(); //0x93 + + unsigned int param2 =0; + param2 = read_data_cmd(); //0x29 + + id = ((param1 & LCM_ID_MASK)<<8)|(param2); + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9340_lcm_drv = +{ + .name = "ili9340", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; + +#ifndef BUILD_UBOOT + +#ifdef JRD_LCD_ESD_RECOVERY + +#include + +#define A_NORMAL 0x84 +#define B_NORMAL 0x63 +#define C_NORMAL 0x04 +#define D_NORMAL 0x00 + +extern void jrd_lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height); +extern void jrd_lcd_waitfornotbusy(void); + +static int get_power_setting_status(void) +{ + + static unsigned int temp0,temp1,temp2,temp3; + jrd_lcd_waitfornotbusy(); + + send_ctrl_cmd(0x09); + read_data_cmd(); //dummy read + temp0 = read_data_cmd(); // 0x84 + temp1 = read_data_cmd(); // 0x63 + temp2 = read_data_cmd(); // 0x04 + temp3 = read_data_cmd(); // 0x00 + + if( (temp0 != A_NORMAL) || (temp1 != B_NORMAL) || (temp2 != C_NORMAL) || (temp3 != D_NORMAL)) + { + printk("---------------------------lcm_init ---------------------------\n"); + lcm_init(); + jrd_lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + } + + return 0; + +} + +JRD_LCM_ESD ili9340_lcm_esd = +{ + .name = "ili9340", + .get_register_value = get_power_setting_status, +}; + +#endif + +#endif \ No newline at end of file diff --git a/alcatel_ot_903d_jrd73_gb/lcm/ili9341/ili9341.c b/alcatel_ot_903d_jrd73_gb/lcm/ili9341/ili9341.c new file mode 100644 index 0000000..93dd4f2 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/ili9341/ili9341.c @@ -0,0 +1,379 @@ + + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x9341) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + + send_ctrl_cmd(0xCF); + send_data_cmd(0x00); + send_data_cmd(0x99); + send_data_cmd(0x30); + + send_ctrl_cmd(0xED); + send_data_cmd(0x67); + send_data_cmd(0x03); + send_data_cmd(0x12); + send_data_cmd(0x81); + + send_ctrl_cmd(0xE8); + send_data_cmd(0x8A); + send_data_cmd(0x0A); + send_data_cmd(0x78); + + send_ctrl_cmd(0xCB); + send_data_cmd(0x39); + send_data_cmd(0x2C); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x02); + + send_ctrl_cmd(0xF7); + send_data_cmd(0x20); + + send_ctrl_cmd(0xEA); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xC0); //Power Control 1 , GVDD + send_data_cmd(0x26); //GVDD=4.75V + + send_ctrl_cmd(0xC1); + send_data_cmd(0x11); //set DDVDH,VGL,VGH + + send_ctrl_cmd(0xC5); //VCOM Control 1, VMH,VML + send_data_cmd(0x2B); + send_data_cmd(0x2C); + + send_ctrl_cmd(0xC7); //VCOM Control 2, VMF + send_data_cmd(0xD4); + + send_ctrl_cmd(0xF6); //Interface Control + send_data_cmd(0x01); + send_data_cmd(0x30); + send_data_cmd(0x00); //RGB interface:0x06 + + /* + send_ctrl_cmd(0xB5); //Blanking Porch Control + send_data_cmd(0x04); + send_data_cmd(0x04); + send_data_cmd(0x02); + send_data_cmd(0x02); + */ + + send_ctrl_cmd(0xB6); + send_data_cmd(0x0A); + send_data_cmd(0xA2); + + send_ctrl_cmd(0x36); //Memory Access Control + send_data_cmd(0x08); + + send_ctrl_cmd(0x3A); //Pixel Format Set + send_data_cmd(0x66); //18bit:0x66;16bit:0x55 + + send_ctrl_cmd(0xB1); + send_data_cmd(0x00); + send_data_cmd(0x19); + + send_ctrl_cmd(0xF2); + send_data_cmd(0x00); + + send_ctrl_cmd(0x26); + send_data_cmd(0x01); + + send_ctrl_cmd(0xE0); //Set Gamma + send_data_cmd(0x0F); //VP63[3:0] + send_data_cmd(0x22); //VP62[5:0] + send_data_cmd(0x20); //VP61[5:0] + send_data_cmd(0x09); //VP59[3:0] + send_data_cmd(0x0D); //VP57[4:0] + send_data_cmd(0x08); //VP50[3:0] + send_data_cmd(0x4E); //VP43[6:0] + send_data_cmd(0xA7); //VP27[3:0];VP36[3:0] + send_data_cmd(0x3F); //VP20[6:0] + send_data_cmd(0x05); //VP13[3:0] + send_data_cmd(0x0B); //VP6[4:0] + send_data_cmd(0x03); //VP4[3:0] + send_data_cmd(0x20); //VP2[5:0] + send_data_cmd(0x23); //VP1[5:0] + send_data_cmd(0x00); //VP0[3:0] + + send_ctrl_cmd(0XE1); //Set Gamma + send_data_cmd(0x00); //VN63[3:0] + send_data_cmd(0x1D); //VN62[5:0] + send_data_cmd(0x1F); //VN61[5:0] + send_data_cmd(0x06); //VN59[3:0] + send_data_cmd(0x12); //VN57[4:0] + send_data_cmd(0x07); //VN50[3:0] + send_data_cmd(0x31); //VN43[6:0] + send_data_cmd(0x58); //VN27[3:0];VN36[3:0] + send_data_cmd(0x40); //VN20[6:0] + send_data_cmd(0x0A); //VN13[3:0] + send_data_cmd(0x14); //VN6[4:0] + send_data_cmd(0x0C); //VN4[3:0] + send_data_cmd(0x1F); //VN2[5:0] + send_data_cmd(0x1C); //VN1[5:0] + send_data_cmd(0x0F); //VN0[3:0] + + send_ctrl_cmd(0x2A); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xEF); + + send_ctrl_cmd(0x2B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x11); //Exit Sleep + MDELAY(120); + + send_ctrl_cmd(0x29); //Display ON + MDELAY(10); + + send_ctrl_cmd(0x2C); //Memory Write + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + params->dbi.te_mode= 1;//libin changed + params->dbi.te_edge_polarity= 1; + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 3; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(100); + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(150); + send_ctrl_cmd(0x29); + MDELAY(50); + send_ctrl_cmd(0x2c); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id=0; + + send_ctrl_cmd(0xD3); + + read_data_cmd(); //dummy code:0 + + read_data_cmd(); // 0x00 + + unsigned int param1 = 0; + param1 =read_data_cmd(); //0x93 + + unsigned int param2 =0; + param2 = read_data_cmd(); //0x41 + + id = ((param1 & LCM_ID_MASK)<<8)|(param2); + + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9341_lcm_drv = +{ + .name = "ili9341", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; + +#ifndef BUILD_UBOOT + +#ifdef JRD_LCD_ESD_RECOVERY + +#include + +#define A_NORMAL 0x84 +#define B_NORMAL 0x63 +#define C_NORMAL 0x04 +#define D_NORMAL 0x00 + +extern void jrd_lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height); +extern void jrd_lcd_waitfornotbusy(void); + +static int get_power_setting_status(void) +{ + static unsigned int temp0,temp1,temp2,temp3; + jrd_lcd_waitfornotbusy(); + + send_ctrl_cmd(0x09); + read_data_cmd(); //dummy read + temp0 = read_data_cmd(); // 0x84 + temp1 = read_data_cmd(); // 0x63 + temp2 = read_data_cmd(); // 0x04 + temp3 = read_data_cmd(); // 0x00 + + if( (temp0 != A_NORMAL) || (temp1 != B_NORMAL) || (temp2 != C_NORMAL) || (temp3 != D_NORMAL)) + { + printk("---------------------------lcm_init ---------------------------\n"); + lcm_init(); + jrd_lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + } + + return 0; + +} + +JRD_LCM_ESD ili9341_lcm_esd = +{ + .name = "ili9341", + .get_register_value = get_power_setting_status, +}; + +#endif + +#endif diff --git a/alcatel_ot_903d_jrd73_gb/lcm/ili9481/ili9481.c b/alcatel_ot_903d_jrd73_gb/lcm/ili9481/ili9481.c new file mode 100644 index 0000000..8afaf41 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/ili9481/ili9481.c @@ -0,0 +1,406 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x5466) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ +#if 0 //modify by JRD request + send_ctrl_cmd(0xC0); +send_data_cmd(0x08); +send_data_cmd(0x07); +send_ctrl_cmd(0xC1); +send_data_cmd(0x04); +send_data_cmd(0x04); +send_ctrl_cmd(0xC2); +send_data_cmd(0x33); + +send_ctrl_cmd(0xB1); +send_data_cmd(0xB0); +send_data_cmd(0x11); +send_ctrl_cmd(0xB4); +send_data_cmd(0x02); + +send_ctrl_cmd(0x36); +send_data_cmd(0x48); + +#if 1//just for temple rework lcd + +send_ctrl_cmd(0x3A); +send_data_cmd(0x66); //0x55 ->0x66 when SMT +#endif +send_ctrl_cmd(0xC5); +send_data_cmd(0x00); +send_data_cmd(0x37); +send_data_cmd(0x80); + +send_ctrl_cmd(0xE0); +send_data_cmd(0x0F); +send_data_cmd(0x1B); +send_data_cmd(0x18); +send_data_cmd(0x0B); +send_data_cmd(0x0E); +send_data_cmd(0x09); +send_data_cmd(0x47); +send_data_cmd(0x94); +send_data_cmd(0x35); +send_data_cmd(0x0A); +send_data_cmd(0x13); +send_data_cmd(0x05); +send_data_cmd(0x08); +send_data_cmd(0x03); +send_data_cmd(0x00); + +send_ctrl_cmd(0XE1); +send_data_cmd(0x0F); +send_data_cmd(0x3A); +send_data_cmd(0x37); +send_data_cmd(0x0B); +send_data_cmd(0x0C); +send_data_cmd(0x05); +send_data_cmd(0x4A); +send_data_cmd(0x24); +send_data_cmd(0x39); +send_data_cmd(0x07); +send_data_cmd(0x10); +send_data_cmd(0x04); +send_data_cmd(0x27); +send_data_cmd(0x25); +send_data_cmd(0x00); + +send_ctrl_cmd(0XF8); +send_data_cmd(0x21); +send_data_cmd(0x04); + +send_ctrl_cmd(0x11); +send_ctrl_cmd(0X35); //libin temp change for te +send_data_cmd(0x00); +MDELAY(120); +send_ctrl_cmd(0x29); + send_ctrl_cmd(0x2c); + #endif + send_ctrl_cmd(0x36);//set address mode + send_data_cmd(0x48); + + send_ctrl_cmd(0x3A); //pixel format + send_data_cmd(0x66);//0x55-16bits,0x66-18bits + //send_data_cmd(0x55);//0x55-16bits,0x66-18bits + + //gamma 2.2 setting + send_ctrl_cmd(0xE0); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x08); + send_data_cmd(0x0F); + send_data_cmd(0x06); + send_data_cmd(0x14); + send_data_cmd(0x0A); + send_data_cmd(0x3A); + send_data_cmd(0x9A); + send_data_cmd(0x49); + send_data_cmd(0x0A); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x1B); + send_data_cmd(0x1E); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE1); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x21); + send_data_cmd(0x24); + send_data_cmd(0x02); + send_data_cmd(0x08); + send_data_cmd(0x05); + send_data_cmd(0x36); + send_data_cmd(0x56); + send_data_cmd(0x45); + send_data_cmd(0x05); + send_data_cmd(0x0B); + send_data_cmd(0x09); + send_data_cmd(0x30); + send_data_cmd(0x37); + send_data_cmd(0x0F); + + + send_ctrl_cmd(0xf2); + send_data_cmd(0x18); + send_data_cmd(0xa3); + send_data_cmd(0x12); + send_data_cmd(0x02); + send_data_cmd(0xB2); + send_data_cmd(0x52); //0x12-->0x92-->0x52 + send_data_cmd(0xff); + send_data_cmd(0x10); + + + send_ctrl_cmd(0xf7); + send_data_cmd(0xa9); + send_data_cmd(0x91); + send_data_cmd(0x2d); + send_data_cmd(0x0a); + send_data_cmd(0x4f); + + send_ctrl_cmd(0xf4); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x08); + send_data_cmd(0x91); + send_data_cmd(0x04); + + send_ctrl_cmd(0xf8); + send_data_cmd(0x21); + send_data_cmd(0x04); + + send_ctrl_cmd(0xf9); + send_data_cmd(0x00); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB4); //Set 2Dot Invertion + send_data_cmd(0x02); + + send_ctrl_cmd(0xB1); //Set Frame Rate + send_data_cmd(0xB0); + send_data_cmd(0x11); + + send_ctrl_cmd(0x20); //Display Inversion OFF + + send_ctrl_cmd(0xc0); + send_data_cmd(0x0D); + send_data_cmd(0x0D); + + + send_ctrl_cmd(0xc1); + send_data_cmd(0x44); + + send_ctrl_cmd(0xB7); + send_data_cmd(0xC6); + + send_ctrl_cmd(0xc5); + send_data_cmd(0x00); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2A); //display area column setting + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2B); //display area page setting + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0xE0); + + + + send_ctrl_cmd(0x11);//exit sleep mode + + send_ctrl_cmd(0X35); //libin temp change for te + send_data_cmd(0x00); + + MDELAY(150); + + send_ctrl_cmd(0x29); //Display on + + MDELAY(20); + + send_ctrl_cmd(0x2C); //memary write +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + params->dbi.te_mode= 1;//libin changed + params->dbi.te_edge_polarity= 1; + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 3; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(100); + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(150); + send_ctrl_cmd(0x29); + MDELAY(50); + send_ctrl_cmd(0x2c); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int lcm_compare_id(void) +{ + + unsigned int id=0; + + + send_ctrl_cmd(0x04); + + + read_data_cmd(); //dummy code:0 + + unsigned int param1 = 0; + param1 =read_data_cmd(); //manufacturer id + + read_data_cmd(); + + unsigned int param2 =0; + param2 = read_data_cmd(); //module/driver id + + id = ((param1 & LCM_ID_MASK)<<8)|(param2); + + + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/inc/lcm_drv.h b/alcatel_ot_903d_jrd73_gb/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..d39ce67 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/inc/lcm_drv.h @@ -0,0 +1,417 @@ + + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + +#define JRD_LCD_ESD_RECOVERY 1 + +typedef struct +{ + const char* name; + unsigned int (*get_register_value)(void); +} JRD_LCM_ESD; +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_latency; + unsigned int wait_period; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + LCM_LANE_NUM LANE_NUM; + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned int pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + unsigned int (*check_status)(void); +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/alcatel_ot_903d_jrd73_gb/lcm/lg4571/lg4571.c b/alcatel_ot_903d_jrd73_gb/lcm/lg4571/lg4571.c new file mode 100644 index 0000000..3d9fe2a --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/lg4571/lg4571.c @@ -0,0 +1,333 @@ + + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/mt65xx_lcm_list.c b/alcatel_ot_903d_jrd73_gb/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..b4a7cd3 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/mt65xx_lcm_list.c @@ -0,0 +1,96 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER zte6516_lcm_drv; +extern LCM_DRIVER tft3p4039_lcm_drv; +extern LCM_DRIVER r61526_lcm_drv; +extern LCM_DRIVER ili9341_lcm_drv; +extern LCM_DRIVER ili9340_lcm_drv; + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(R61526) + &r61526_lcm_drv, +#endif + +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(ZTE6516) + &zte6516_lcm_drv, +#endif + +#if defined(TFT3P4039) + &tft3p4039_lcm_drv, +#endif + +#if defined(ILI9341) + &ili9341_lcm_drv, +#endif + +#if defined(ILI9340) + &ili9340_lcm_drv +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/alcatel_ot_903d_jrd73_gb/lcm/mtk_cust.mk b/alcatel_ot_903d_jrd73_gb/lcm/mtk_cust.mk new file mode 100755 index 0000000..48c1fe1 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/mtk_cust.mk @@ -0,0 +1,2 @@ +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/alcatel_ot_903d_jrd73_gb/lcm/nt35582/nt35582.c b/alcatel_ot_903d_jrd73_gb/lcm/nt35582/nt35582.c new file mode 100644 index 0000000..8de5935 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/nt35582/nt35582.c @@ -0,0 +1,326 @@ + + +#include + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c b/alcatel_ot_903d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..17d71cc --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,395 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x05);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.wait_period = 1; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/r61526/r61526.c b/alcatel_ot_903d_jrd73_gb/lcm/r61526/r61526.c new file mode 100644 index 0000000..121e74b --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/r61526/r61526.c @@ -0,0 +1,452 @@ + + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x1526) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x00B0);//Manufacturer Command Access Protect + send_data_cmd(0x003F); + send_data_cmd(0x003F); + MDELAY(100); + + send_ctrl_cmd(0x00FE);//? + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0021); + send_data_cmd(0x00B4); + + send_ctrl_cmd(0x00B3);//Frame Memory Access and Interface Setting + send_data_cmd(0x0000); + send_data_cmd(0x0010); + + send_ctrl_cmd(0x00E0);//NVM Access Control + send_data_cmd(0x0000);//NVAE: NVM access enable register. NVM access is enabled when NVAE=1. + send_data_cmd(0x0040);//FTT: NVM control bit. + MDELAY(50); + + send_ctrl_cmd(0x00B3); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + + send_ctrl_cmd(0x00FE); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0021); + send_data_cmd(0x0030); + + send_ctrl_cmd(0x00B0); + send_data_cmd(0x003F); + send_data_cmd(0x003F); + + send_ctrl_cmd(0x00B3); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + + send_ctrl_cmd(0x00B4); + send_data_cmd(0x0000); + + send_ctrl_cmd(0x00C0); + send_data_cmd(0x0013);//GIP REV SM GS BGR SS + send_data_cmd(0x004F); + send_data_cmd(0x0000); + send_data_cmd(0x0010); + send_data_cmd(0x00A0);//BLV=0 LINE + send_data_cmd(0x0000); + send_data_cmd(0x0001); + send_data_cmd(0x0000); + //Frame frequency (fFRM)={fosc/(Clock per linedivision ratio(NL + FP + BP))} [Hz] + send_ctrl_cmd(0x00C1); + send_data_cmd(0x0001);//BC0 Frame inversion(0)/Line inversion(1) + send_data_cmd(0x0002);//DIV0[1:0] 800kHz + send_data_cmd(0x0020);//RTN0[5:0] clocks 21 + send_data_cmd(0x0008);//BP0[7:0] 4 lines + send_data_cmd(0x0008);//FP0[7:0] 4 lines + MDELAY(50); + + send_ctrl_cmd(0x00C3); //PRTIAL MODE + send_data_cmd(0x0001);//BC2 + send_data_cmd(0x0000);//DIV2[1:0] + send_data_cmd(0x0021);//RTN2[5:0] + send_data_cmd(0x0008);//BP2[7:0] + send_data_cmd(0x0008);//FP2[7:0] + MDELAY(50); + + send_ctrl_cmd(0x00C4); + send_data_cmd(0x0011); + send_data_cmd(0x0001); + send_data_cmd(0x0033); + send_data_cmd(0x0003); + + send_ctrl_cmd(0x00C8); + send_data_cmd(0x0003); + send_data_cmd(0x000a); + send_data_cmd(0x0006); + send_data_cmd(0x000e); + send_data_cmd(0x000e); + send_data_cmd(0x0007); + send_data_cmd(0x0005); + send_data_cmd(0x0005); + send_data_cmd(0x0021); + send_data_cmd(0x0004); + send_data_cmd(0x0000); + send_data_cmd(0x0020); + send_data_cmd(0x0006); + send_data_cmd(0x0006); + send_data_cmd(0x0009); + send_data_cmd(0x0010); + send_data_cmd(0x0011); + send_data_cmd(0x0009); + send_data_cmd(0x000e); + send_data_cmd(0x0005); + send_data_cmd(0x0006); + send_data_cmd(0x0001); + + + send_ctrl_cmd(0x00C9); + //send_ctrl_cmd(0x00C8); + send_data_cmd(0x0003); + send_data_cmd(0x000a); + send_data_cmd(0x0006); + send_data_cmd(0x000e); + send_data_cmd(0x000e); + send_data_cmd(0x0007); + send_data_cmd(0x0005); + send_data_cmd(0x0005); + send_data_cmd(0x0021); + send_data_cmd(0x0004); + send_data_cmd(0x0000); + send_data_cmd(0x0020); + send_data_cmd(0x0006); + send_data_cmd(0x0006); + send_data_cmd(0x0009); + send_data_cmd(0x0010); + send_data_cmd(0x0011); + send_data_cmd(0x0009); + send_data_cmd(0x000e); + send_data_cmd(0x0005); + send_data_cmd(0x0006); + send_data_cmd(0x0001); + + send_ctrl_cmd(0x00CA); + //send_ctrl_cmd(0x00C8); + send_data_cmd(0x0003); + send_data_cmd(0x000a); + send_data_cmd(0x0006); + send_data_cmd(0x000e); + send_data_cmd(0x000e); + send_data_cmd(0x0007); + send_data_cmd(0x0005); + send_data_cmd(0x0005); + send_data_cmd(0x0021); + send_data_cmd(0x0004); + send_data_cmd(0x0000); + send_data_cmd(0x0020); + send_data_cmd(0x0006); + send_data_cmd(0x0006); + send_data_cmd(0x0009); + send_data_cmd(0x0010); + send_data_cmd(0x0011); + send_data_cmd(0x0009); + send_data_cmd(0x000e); + send_data_cmd(0x0005); + send_data_cmd(0x0006); + send_data_cmd(0x0001); + + + + send_ctrl_cmd(0x00D0); + send_data_cmd(0x0033); + send_data_cmd(0x0053); + send_data_cmd(0x0081); + send_data_cmd(0x0031); + + send_ctrl_cmd(0x00D1); + send_data_cmd(0x002f);//40 + send_data_cmd(0x0057); + //send_data_cmd(0x0010); + + send_ctrl_cmd(0x00D2); + send_data_cmd(0x0003); + send_data_cmd(0x0024); + + send_ctrl_cmd(0x00D4); + send_data_cmd(0x0003); + send_data_cmd(0x0024); + + send_ctrl_cmd(0x00E2); + send_data_cmd(0x003F); + + send_ctrl_cmd(0x0035);//set_tear_on + send_data_cmd(0x0000); + + send_ctrl_cmd(0x0036); + send_data_cmd(0x0000); + + send_ctrl_cmd(0x003A);//set_pixel_format + send_data_cmd(0x0066);//66 + + send_ctrl_cmd(0x002A);//set_column_address + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x00EF); + + send_ctrl_cmd(0x002B);//set_page_address: + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0001); + send_data_cmd(0x003F); + + send_ctrl_cmd(0x002C);//write_memory_start: + send_ctrl_cmd(0x0011);//exit_sleep_mode + MDELAY(100); + send_ctrl_cmd(0x0029);//set_display_on + MDELAY(200); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + params->dbi.te_mode= 1;//libin changed + params->dbi.te_edge_polarity= 1; + params->dbi.parallel.write_setup = 4; + params->dbi.parallel.write_hold = 4; + params->dbi.parallel.write_wait = 12; + params->dbi.parallel.read_setup = 4; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(100); + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(150); + send_ctrl_cmd(0x29); + MDELAY(50); + send_ctrl_cmd(0x2c); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int lcm_compare_id(void) +{ + + unsigned int id=0; + + send_ctrl_cmd(0xBF); + + read_data_cmd(); //0x01 + + read_data_cmd(); // 0x01 + + read_data_cmd(); //0x022 + + unsigned int param1 = 0; + param1 =read_data_cmd(); //0x15 + + unsigned int param2 =0; + param2 = read_data_cmd(); //0x26 + + id = ((param1 & LCM_ID_MASK)<<8)|(param2); + + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER r61526_lcm_drv = +{ + .name = "r61526", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; + +#ifndef BUILD_UBOOT + +#ifdef JRD_LCD_ESD_RECOVERY + +#include + +#define A_NORMAL 0x2f +#define B_NORMAL 0x57 +#define C_NORMAL 0x10 + +extern void jrd_lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height); +extern void jrd_lcd_waitfornotbusy(void); + +static int get_power_setting_status(void) +{ + static unsigned int temp0,temp1,temp2; + jrd_lcd_waitfornotbusy(); + + send_ctrl_cmd(0xD1); + read_data_cmd(); //dummy read + temp0 = read_data_cmd(); // 0x2f + temp1 = read_data_cmd(); // 0x57 + temp2 = read_data_cmd(); // 0x10 + + if( (temp0 != A_NORMAL) || (temp1 != B_NORMAL) || (temp2 != C_NORMAL) ) + { + printk("---------------------------lcm_init ---------------------------\n"); + lcm_init(); + jrd_lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + } + + return 0; + +} + +JRD_LCM_ESD r61526_lcm_esd = +{ + .name = "r61526", + .get_register_value = get_power_setting_status, +}; + +#endif + +#endif + diff --git a/alcatel_ot_903d_jrd73_gb/lcm/s6d0170/s6d0170.c b/alcatel_ot_903d_jrd73_gb/lcm/s6d0170/s6d0170.c new file mode 100644 index 0000000..0b74ae7 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/s6d0170/s6d0170.c @@ -0,0 +1,304 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/spfd5461a/spfd5461a.c b/alcatel_ot_903d_jrd73_gb/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..39d3f92 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,352 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/ta7601/ta7601.c b/alcatel_ot_903d_jrd73_gb/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..d24d640 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/ta7601/ta7601.c @@ -0,0 +1,285 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/tft1p3037/tft1p3037.c b/alcatel_ot_903d_jrd73_gb/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..efa67b0 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,316 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/tft3p4039/tft3p4039.c b/alcatel_ot_903d_jrd73_gb/lcm/tft3p4039/tft3p4039.c new file mode 100644 index 0000000..49bc8a2 --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/tft3p4039/tft3p4039.c @@ -0,0 +1,351 @@ + + +#include +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define LCM_ID (0x8357) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +//static unsigned int lcm_compare_id(void); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + MDELAY(10); + send_ctrl_cmd(0X0011); //SLEEP OUT + MDELAY(120); + + send_ctrl_cmd(0X00EE); //SET EQ + send_data_cmd(0X0002); + send_data_cmd(0X0001); + send_data_cmd(0X0002); + send_data_cmd(0X0001); + + send_ctrl_cmd(0xED);//Set DIR TIM + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x9A); + send_data_cmd(0x9A); + send_data_cmd(0x9B); + send_data_cmd(0x9B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x01); + send_data_cmd(0xA2); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB4);//Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC0); //Set Panel Driving + send_data_cmd(0x10); //REV SM GS + send_data_cmd(0x3B); // NL[5:0] + send_data_cmd(0x00); //SCN[6:0] + send_data_cmd(0x02); //NDL 0 PTS[2:0] + send_data_cmd(0x11); //PTG ISC[3:0] + + send_ctrl_cmd(0xC8);//Set Gamma + send_data_cmd(0x00); //KP1,KP0 + send_data_cmd(0x46); //KP3,KP2 + send_data_cmd(0x12); //KP5,KP4 + send_data_cmd(0x20); //RP1,RP0 + send_data_cmd(0x0c); //VRP0 01 + send_data_cmd(0x00); //VRP1 + send_data_cmd(0x56); //KN1,KN0 + send_data_cmd(0x12); //KN3,KN2 + send_data_cmd(0x67); //KN5,KN4 + send_data_cmd(0x02); //RN1,RN0 + send_data_cmd(0x00); //VRN0 + send_data_cmd(0x0c); //VRN1 01 + + + send_ctrl_cmd(0xD0);//Set Power + send_data_cmd(0x44);//DDVDH :5.28 + send_data_cmd(0x44); // BT VGH:15.84 VGL:-7.92 + send_data_cmd(0x05);//VREG1 4.625V + + + send_ctrl_cmd(0xD1);//Set VCOM + send_data_cmd(0x4b); //VCOMH 3.367 //3B + send_data_cmd(0x14);//VCOM 5.2725 + + send_ctrl_cmd(0xD2); + send_data_cmd(0x04); + send_data_cmd(0x22); //12 + + send_ctrl_cmd(0xD3); + send_data_cmd(0x04); + send_data_cmd(0x12); + + send_ctrl_cmd(0xD4); + send_data_cmd(0x07); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x00); + + send_ctrl_cmd(0xC5); //Set Frame rate + send_data_cmd(0x08); //61.51Hz + + + send_ctrl_cmd(0X0036); + send_data_cmd(0X000a); + + send_ctrl_cmd(0X003A); + send_data_cmd(0X0006); + + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00E0); + MDELAY(120); + + send_ctrl_cmd(0x29); //Display On + MDELAY(5); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; //? + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; // im0 im1:00 + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + + params->dbi.parallel.write_setup = 2;//t(ast)=10ns + params->dbi.parallel.write_hold = 3; //t(wrh)/8-1=30ns + params->dbi.parallel.write_wait = 4; //(25+10)/8-1 + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 22; //(10+170)/8-2 + params->dbi.parallel.wait_period = 0;//t(rdh) + params->dbi.te_mode= LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity= LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0001); // Set as 1-th scanline, line lsb first + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x0028); + send_ctrl_cmd(0x0010); + MDELAY(10); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x0011); + MDELAY(120); + send_ctrl_cmd(0x0029); + +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + + +static unsigned int lcm_compare_id(void) +{ + + unsigned int id = 0; + + send_ctrl_cmd(0xBF); + + + read_data_cmd(); //dummy code:0 + + read_data_cmd(); //MIPI:0x1 + + read_data_cmd();//MIPI: 0x62 + + unsigned int param1 =0; + param1 = read_data_cmd(); //should 0x83 + + unsigned int param2 = 0; + param2 =read_data_cmd();//should 0x57 + + read_data_cmd(); //should 0xff + + id = ((param1&LCM_ID_MASK)<< 8)| (param2&LCM_ID_MASK); + + + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft3p4039_lcm_drv = +{ + .name = "tft3p4039", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_903d_jrd73_gb/lcm/zte6516/zte6516.c b/alcatel_ot_903d_jrd73_gb/lcm/zte6516/zte6516.c new file mode 100644 index 0000000..d5ef25a --- /dev/null +++ b/alcatel_ot_903d_jrd73_gb/lcm/zte6516/zte6516.c @@ -0,0 +1,314 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (240) +#define LCM_ID (0x57) +// --------------------------------------------------------------------------- +// Local Variables: +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (10) +#define POWER_ON_SEQ_DELAY (200) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0x00FF & (lcm_util.read_data() >> 1); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd((regIndex & 0x00FF) << 1); + send_data_cmd((regData & 0x00FF) << 1); +} + + +static void init_lcm_registers(void) +{ + + + //=======wenbo add============== + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x0072, 0x00F6); + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x00F2, 0x0000); + set_lcm_register(0x00E4, 0x0000); + set_lcm_register(0x00E5, 0x001C); + set_lcm_register(0x00E6, 0x0000); + set_lcm_register(0x00E7, 0x001C); + set_lcm_register(0x00EE, 0x0042); + set_lcm_register(0x00EF, 0x00DB); + set_lcm_register(0x002E, 0x0098); + set_lcm_register(0x0040, 0x0000); + set_lcm_register(0x0041, 0x002E); + set_lcm_register(0x0042, 0x002D); + set_lcm_register(0x0043, 0x003F); + set_lcm_register(0x0044, 0x003F); + set_lcm_register(0x0045, 0x003F); + set_lcm_register(0x0046, 0x002C); + set_lcm_register(0x0047, 0x007F); + set_lcm_register(0x0048, 0x0007); + set_lcm_register(0x0049, 0x0005); + set_lcm_register(0x004A, 0x0008); + set_lcm_register(0x004B, 0x0013); + set_lcm_register(0x004C, 0x001E); + set_lcm_register(0x0050, 0x0000); + set_lcm_register(0x0051, 0x0000); + set_lcm_register(0x0052, 0x0000); + set_lcm_register(0x0053, 0x0012); + set_lcm_register(0x0054, 0x0011); + set_lcm_register(0x0055, 0x003F); + set_lcm_register(0x0056, 0x0000); + set_lcm_register(0x0057, 0x0053); + set_lcm_register(0x0058, 0x0001); + set_lcm_register(0x0059, 0x000C); + set_lcm_register(0x005A, 0x0017); + set_lcm_register(0x005B, 0x001A); + set_lcm_register(0x005C, 0x0018); + set_lcm_register(0x005D, 0x00C3); + set_lcm_register(0x0002, 0x0000); + set_lcm_register(0x0003, 0x0000); + set_lcm_register(0x0004, 0x0001); + set_lcm_register(0x0005, 0x003F); + set_lcm_register(0x0006, 0x0000); + set_lcm_register(0x0007, 0x0000); + set_lcm_register(0x0008, 0x0000); + set_lcm_register(0x0009, 0x00EF); // + set_lcm_register(0x0024, 0x0022); + set_lcm_register(0x0025, 0x0064); + set_lcm_register(0x0023, 0x0090); + set_lcm_register(0x001B, 0x000E); + set_lcm_register(0x001D, 0x0011); + set_lcm_register(0x0019, 0x0001); + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x0001, 0x0000); + set_lcm_register(0x001F, 0x0080); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x0090); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x00D4); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x0028, 0x0008); + MDELAY(40); + set_lcm_register(0x0028, 0x0038); + MDELAY(40); //DELAY 40MS + set_lcm_register(0x0028, 0x003C); + //wr_com(0x0016, 0x0020); //0020 + set_lcm_register(0x0017, 0x0006); //18bit + send_ctrl_cmd(0x0022 << 1); + //===========wenbo add end========= + + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; //LCM_DBI_CLOCK_FREQ_52M + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2;//1; //0 + params->dbi.parallel.write_hold = 1; ////3 33 + params->dbi.parallel.write_wait = 3; //3// + params->dbi.parallel.read_setup = 0; ////2 + params->dbi.parallel.read_latency = 10; ////19 + params->dbi.parallel.wait_period = 0; ////0 +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + + static void lcm_suspend(void) + { + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0004); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0000); + + set_lcm_register(0x001F, 0x0089); + + set_lcm_register(0x0019, 0x0000); + + + /* set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); + */ + } + + + +static void lcm_resume(void) + { + + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0019, 0x0001); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x001F, 0x0080); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x00D4); + + MDELAY(5); + + set_lcm_register(0x0028, 0x0008); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x003C); + + /* set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); + */ + } + + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) + { + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x0022 << 1); + } + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER zte6516_lcm_drv = +{ + .name = "zte6516", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/bm8578/bm8578.c b/alcatel_ot_916d_jrd73_gb/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..e7283e3 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/bm8578/bm8578.c @@ -0,0 +1,271 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/dummy/dummy.c b/alcatel_ot_916d_jrd73_gb/lcm/dummy/dummy.c new file mode 100644 index 0000000..9e80fd4 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/dummy/dummy.c @@ -0,0 +1,112 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_916d_jrd73_gb/lcm/hx8357B/hx8357b.c b/alcatel_ot_916d_jrd73_gb/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..10df35a --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/hx8357B/hx8357b.c @@ -0,0 +1,407 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8357) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +#if 0 + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +#else + MDELAY(10); + send_ctrl_cmd(0x11);//Sleep Out + MDELAY(120); + + send_ctrl_cmd(0xEE);//Set EQ + send_data_cmd(0x02); + send_data_cmd(0x01); + send_data_cmd(0x02); + send_data_cmd(0x01); + + send_ctrl_cmd(0xED);//Set DIR TIM + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x9A); + send_data_cmd(0x9A); + send_data_cmd(0x9B); + send_data_cmd(0x9B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x01); + send_data_cmd(0xA2); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB4);//Set RM, DM + send_data_cmd(0x00);// + + send_ctrl_cmd(0xC0); //Set Panel Driving + send_data_cmd(0x10); //REV SM GS + send_data_cmd(0x3B); // NL[5:0] + send_data_cmd(0x00); //SCN[6:0] + send_data_cmd(0x02); //NDL 0 PTS[2:0] + send_data_cmd(0x11); //PTG ISC[3:0] + + send_ctrl_cmd(0xC8);//Set Gamma + send_data_cmd(0x00); //KP1,KP0 + send_data_cmd(0x46); //KP3,KP2 + send_data_cmd(0x12); //KP5,KP4 + send_data_cmd(0x20); //RP1,RP0 + send_data_cmd(0x0c); //VRP0 01 + send_data_cmd(0x00); //VRP1 + send_data_cmd(0x56); //KN1,KN0 + send_data_cmd(0x12); //KN3,KN2 + send_data_cmd(0x67); //KN5,KN4 + send_data_cmd(0x02); //RN1,RN0 + send_data_cmd(0x00); //VRN0 + send_data_cmd(0x0c); //VRN1 01 + + send_ctrl_cmd(0xD0);//Set Power + send_data_cmd(0x44);//DDVDH :5.28 + send_data_cmd(0x44); // BT VGH:15.84 VGL:-7.92 + send_data_cmd(0x05);//VREG1 4.625V + + send_ctrl_cmd(0xD1);//Set VCOM + send_data_cmd(0x4b); //VCOMH 3.367 //3B + send_data_cmd(0x14);//VCOM 5.2725 + + send_ctrl_cmd(0xD2); + send_data_cmd(0x04); + send_data_cmd(0x22); //12 + + send_ctrl_cmd(0xD3); + send_data_cmd(0x04); + send_data_cmd(0x12); + + send_ctrl_cmd(0xD4); + send_data_cmd(0x07); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x00); + + send_ctrl_cmd(0xC5); //Set Frame rate + send_data_cmd(0x08); //61.51Hz + + + send_ctrl_cmd(0X0036); + send_data_cmd(0X000a); + + send_ctrl_cmd(0X003A); + send_data_cmd(0X0006); + + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00E0); + MDELAY(120); + + send_ctrl_cmd(0x29); //Display On + MDELAY(5); +#endif +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id; + send_ctrl_cmd(0xBF); // SET password + read_data_cmd(); //dummy read + read_data_cmd(); //01 + read_data_cmd(); //62 + id= read_data_cmd(); //83 + id= ( id<< 8 ) | read_data_cmd(); //57 + read_data_cmd(); //ff + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + //.set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/hx8368A/hx8368a.c b/alcatel_ot_916d_jrd73_gb/lcm/hx8368A/hx8368a.c new file mode 100644 index 0000000..becb800 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/hx8368A/hx8368a.c @@ -0,0 +1,368 @@ + + +#include + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (240) +#define LCM_ID (0x68) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(100); + + send_ctrl_cmd(0xB9); // Set EXTC + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x68); + MDELAY(5); + + send_ctrl_cmd(0xBB); // Set OTP + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x80); //OTP load disable + MDELAY(5); + + send_ctrl_cmd(0xC2); // For Himax internel use + send_data_cmd(0x00); + send_data_cmd(0x30); + MDELAY(5); + + send_ctrl_cmd(0xC0); // For Himax internel use + send_data_cmd(0x1B); + send_data_cmd(0x05); + send_data_cmd(0x08); + send_data_cmd(0xEC); + send_data_cmd(0x00); + send_data_cmd(0x01); + MDELAY(5); + + send_ctrl_cmd(0xE3); // For Himax internel use + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x40); + send_data_cmd(0x00); + MDELAY(5); + + send_ctrl_cmd(0xBD); // For Himax internel use + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x52); + MDELAY(5); + + send_ctrl_cmd(0xBF); // For Himax internel use + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x2C); + MDELAY(5); + + send_ctrl_cmd(0xB1); // Set Power + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x1e); //30 + send_data_cmd(0x04); + send_data_cmd(0x22); + send_data_cmd(0x11); + send_data_cmd(0xD4); + MDELAY(5); + + send_ctrl_cmd(0xB6); // Set VCOM + send_data_cmd(0xC1); // VMF//A6 dithering stripe--->ACh is OK! + send_data_cmd(0x37); // VMH + send_data_cmd(0x10); // VML + MDELAY(5); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x04); + send_data_cmd(0x21); + send_data_cmd(0x20); + send_data_cmd(0x1B); + send_data_cmd(0x1E); + send_data_cmd(0x30); + send_data_cmd(0x0F); + send_data_cmd(0x55); + send_data_cmd(0x04); + send_data_cmd(0x04); + send_data_cmd(0x05); + send_data_cmd(0x0A); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x21); + send_data_cmd(0x24); + send_data_cmd(0x1F); + send_data_cmd(0x1E); + send_data_cmd(0x3B); + send_data_cmd(0x2A); + send_data_cmd(0x70); + send_data_cmd(0x08); + send_data_cmd(0x15); + send_data_cmd(0x1A); + send_data_cmd(0x1B); + send_data_cmd(0x1B); + send_data_cmd(0xFF); + MDELAY(5); + + send_ctrl_cmd(0xB0); // Set OSC + send_data_cmd(0x0b); //0d + send_data_cmd(0x01); + MDELAY(5); + + send_ctrl_cmd(0xcc); + send_data_cmd(0x04); + + send_ctrl_cmd(0x36); // Set BGR + send_data_cmd(0x49); //0X08 + + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + //send_ctrl_cmd(0x44); + //send_data_cmd(0x00); //7f + //send_data_cmd(0x0a); + + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(150); + + send_ctrl_cmd(0x29); //Display On + MDELAY(5); + + send_ctrl_cmd(0x2C); //Write data to SRAM +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M;//52 + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + params->dbi.te_mode= 1;//libin changed 1 + params->dbi.te_edge_polarity= 1;// 1 + /////////////////ILI9481 +///////////changed by max + params->dbi.parallel.write_setup = 4; + params->dbi.parallel.write_hold = 4; + params->dbi.parallel.write_wait = 12; + params->dbi.parallel.read_setup = 4; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 1;//0 +} + + +static void lcm_init(void) +{ + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(100); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); // display off + MDELAY(50);// delay for 100ms + send_ctrl_cmd(0x10); // Enter Sleep mode + MDELAY(150); +} + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11);//Exit Sleep + MDELAY(100); + /////////////////////////////////////////// + ////////GRAM data write //////////////////// + ////////////////////////////////////////// + // Display ON Setting// + send_ctrl_cmd(0x29);//Display On + MDELAY(10); + send_ctrl_cmd(0x2C); //Memory Write +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x68); + send_ctrl_cmd(0xD0); + read_data_cmd(); + read_data_cmd(); + return (LCM_ID == read_data_cmd())?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hx8368a_lcm_drv = +{ + .name = "hx8368a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; + +#ifndef BUILD_UBOOT + +#ifdef JRD_LCD_ESD_RECOVERY + +#include + +extern void jrd_lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height); +extern void jrd_lcd_waitfornotbusy(void); + +static int get_power_setting_status(void) +{ + unsigned int id1,id2; + jrd_lcd_waitfornotbusy(); + + send_ctrl_cmd(0x09); + read_data_cmd(); //dummy read + id1 = read_data_cmd(); // 0xa4 + id1 = (id1 << 8) | read_data_cmd(); // 0x63 + id1 = (id1 << 8) | read_data_cmd(); // 0x06 + id1 = (id1 << 8) | read_data_cmd(); // 0x00 + + send_ctrl_cmd(0xb6); + read_data_cmd(); //dummy read + id2 = read_data_cmd(); //c1 + id2= (id2<< 8) | read_data_cmd(); //37 + id2= (id2<< 8) | read_data_cmd(); //10 + + if( (id1 != 0xa4630600) || (id2 != 0xc13710)) + { + printk("---------------------------lcm_init ---------------------------\n"); + lcm_init(); + jrd_lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + } + + return 0; + +} + +JRD_LCM_ESD hx8368a_lcm_esd = +{ + .name = "hx8368a", + .get_register_value = get_power_setting_status, +}; + +#endif + +#endif + + diff --git a/alcatel_ot_916d_jrd73_gb/lcm/hx8369/hx8369.c b/alcatel_ot_916d_jrd73_gb/lcm/hx8369/hx8369.c new file mode 100644 index 0000000..f061796 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/hx8369/hx8369.c @@ -0,0 +1,533 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +#if defined(LCM_DSI_CMD_MODE) + { + data_array[0]=0x00043902; + data_array[1]=0x6983FFB9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00103902; + data_array[1]=0x032000B2; + data_array[2]=0xFF007003; + data_array[3]=0x00000000; + data_array[4]=0x01000303; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0]=0x00063902; + data_array[1]=0x700800B4; + data_array[2]=0x0000060E; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; + data_array[1] = 0x030100D5; + data_array[2] = 0x08020100; + data_array[3] = 0x00131180; + data_array[4] = 0x51064000; + data_array[5] = 0x71000007; + data_array[6] = 0x07046005; + data_array[7] = 0x0000060F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00143902; + data_array[1] = 0x340085B1; + data_array[2] = 0x0E0E0006; + data_array[3] = 0x1A1A2C24; + data_array[4] = 0xE6013A07; + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + // color format + { + // RGB565 + //data_array[0] = 0x053A1500; + // RGB666 + //data_array[0] = 0x063A1500; + // RGB888 + data_array[0] = 0x073A1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } + + data_array[0] = 0x02CC1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00033902; + data_array[1] = 0x006C6CB6 ; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + // ENABLE FMARK + //data_array[0] = 0x00023902; + //data_array[1] = 0x00000035 ; + //dsi_set_cmdq(&data_array, 2, 1); + //MDELAY(10); + + //data_array[0] = 0x00351500; + //dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(10); + + // SET GAMMA + data_array[0] = 0x00233902; + data_array[1] = 0x140C00E0; + data_array[2] = 0x293F3F3F; + data_array[3] = 0x0F0C0654; + data_array[4] = 0x15131513; + data_array[5] = 0x0C001F14; + data_array[6] = 0x3F3F3F14; + data_array[7] = 0x0C065429; + data_array[8] = 0x1315130F; + data_array[9] = 0x001F1415; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + + data_array[0] = 0x000E3902; //// SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA ; + data_array[2] = 0x10000A00 ; + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018 ; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + } +#else + { + data_array[0] = 0x00043902; // SET password + data_array[1] = 0x6983FFB9; // + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x00143902; //// SET Power + data_array[1] = 0x340085B1; // + data_array[2] = 0x0F0F0007; // + data_array[3] = 0x3F3F322A; // + data_array[4] = 0xE6013A01; // + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + data_array[0] = 0x00103902; //// SET Display 480x800 + data_array[1] = 0x032300B2; // + data_array[2] = 0xFF007003; // + data_array[3] = 0x00000000; // + data_array[4] = 0x01000303; // + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00063902; // SET Display + data_array[1] = 0x801800B4; + data_array[2] = 0x00000206; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x00033902; //// SET VCOM + data_array[1] = 0x004242B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; //// SET GIP + data_array[1] = 0x030400D5; + data_array[2] = 0x28050100; + data_array[3] = 0x00030170; + data_array[4] = 0x51064000; + data_array[5] = 0x41000007; + data_array[6] = 0x07075006; + data_array[7] = 0x0000040F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00233902; //// SET GAMMA + data_array[1] = 0x191300E0; // + data_array[2] = 0x283F3D38; // + data_array[3] = 0x0E0D0746; // + data_array[4] = 0x14121512; // + data_array[5] = 0x1300170F; + data_array[6] = 0x3F3D3819; + data_array[7] = 0x0D074628; + data_array[8] = 0x1215120E; + data_array[9] = 0x00170F14; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + +#if 0 + switch(g_ColorFormat) + { + case PACKED_RGB565: + data_array[0] = 0x553A1500; // SET pixel format + break; + + case LOOSED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + case PACKED_RGB888: + data_array[0] = 0x773A1500; // SET pixel format + break; + + case PACKED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + default: + //dbg_print("Format setting error \n\r"); + while(1); + break; + } + + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +#endif + data_array[0] = 0x000E3902; // SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA; // + data_array[2] = 0x10000A00; // + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } +#endif + //------------------------------------------------------------------------ + // LUT for HX8369 + //------------------------------------------------------------------------ + if (1)//(g_ColorFormat==0) + { + data_array[0] = 0x00C13902; //Set Color LUT 1 + data_array[1] = 0x1008002D; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000FF; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT 2 + data_array[1] = 0x08040000; + data_array[2] = 0x1814100C; + data_array[3] = 0x2824201C; + data_array[4] = 0x3834302C; + data_array[5] = 0x4844403C; + data_array[6] = 0x5854504C; + data_array[7] = 0x6864605C; + data_array[8] = 0x7874706C; + data_array[9] = 0x8884807C; + data_array[10] = 0x9894908C; + data_array[11] = 0xA8A4A09C; + data_array[12] = 0xB8B4B0AC; + data_array[13] = 0xC8C4C0BC; + data_array[14] = 0xD8D4D0CC; + data_array[15] = 0xE8E4E0DC; + dsi_set_cmdq(&data_array, 16, 1); + + MDELAY(10); + + data_array[0] = 0xF8F4F0EC; //Set Color LUT 3 + data_array[1] = 0x100800FC; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000F8; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT + data_array[1] = 0x00000000; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + } + +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // DBI + //params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // DPI + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.intermediat_buffer_num = 2; + + // DSI + params->dsi.DSI_WMEM_CONTI=0x3C; + params->dsi.DSI_RMEM_CONTI=0x3E; + //params->dsi.LANE_NUM=LCM_ONE_LANE; + params->dsi.LANE_NUM=LCM_TWO_LANE; + params->dsi.VC_NUM=0x0; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + params->dsi.HS_TRAIL=0x14; + params->dsi.HS_ZERO=0x14; + params->dsi.HS_PRPR=0x0A; + params->dsi.LPX=0x05; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x37; + params->dsi.TA_SURE=0x16; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x14; + params->dsi.CLK_ZERO=0x14; + params->dsi.LPX_WAIT=0x0A; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x0A; + + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + + //params->dsi.pll_div2=4; // div2=0~15: fout=fvo/(2*div2) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + //data_array[6]= 0x002c3901; + + dsi_set_cmdq(&data_array, 7, 0); + +} + +LCM_DRIVER hx8369_dsi_lcm_drv = +{ + .name = "hx8369_dsi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if defined(LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif + }; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c b/alcatel_ot_916d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c new file mode 100644 index 0000000..34e001e --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c @@ -0,0 +1,573 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (240) +#define LCM_ID (0x42) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + + //VCI=2.8V + // MDELAY(50); //Wait for Power stabilization + //----------- LCM Reset before initialized ---------// + // LcmReset=1; + // MDELAY(1); + // LcmReset=0; //LCM Hardware Reset. + // MDELAY(10); + // LcmReset=1; + // MDELAY(120); //delay + //----------------------------------------------------------// + // + //************* Start Initial Sequence **********// + send_ctrl_cmd(0xB9); //Set EXTC + send_data_cmd(0xFF); + send_data_cmd(0x93); + send_data_cmd(0x42); + + send_ctrl_cmd(0xCB); + send_data_cmd(0x19); + send_data_cmd(0xE4);//A4 + + send_ctrl_cmd(0xB6); //Display Function Control + send_data_cmd(0x0A);//PTG[1:0],PT[1:0] + send_data_cmd(0xE2);//REV,GS,SS,SM,ISC[3:0] + send_data_cmd(0x1D);//NL[5:0] + + send_ctrl_cmd(0x36); //Memory Access Control + send_data_cmd(0x08);//MY,MX,MV,ML,BGR,MH + + send_ctrl_cmd(0x3A); //Pixel Format Set + send_data_cmd(0x66);//18bit,262k + //send_data_cmd(0x55);//16bit,56k,DPI [2:0],DBI [2:0] + ///////////////////////////////////// + ///////gamma 2.2 setting///////////// + + send_ctrl_cmd(0xC0); + send_data_cmd(0x1D); + send_data_cmd(0x0A); + send_ctrl_cmd(0xC1); + send_data_cmd(0x01); + send_ctrl_cmd(0xC2); + send_data_cmd(0x22); + send_ctrl_cmd(0xC5); + send_data_cmd(0x20);//2f + send_data_cmd(0x20); + send_ctrl_cmd(0xC7); + send_data_cmd(0xDb);//c3 + send_ctrl_cmd(0xB8); + send_data_cmd(0x0b);//08 + send_ctrl_cmd(0xE0); + send_data_cmd(0x0F); + send_data_cmd(0x27); + send_data_cmd(0x23); + send_data_cmd(0x0b); + send_data_cmd(0x0F); + send_data_cmd(0x09); + send_data_cmd(0x52); + send_data_cmd(0x99); + send_data_cmd(0x3f); + send_data_cmd(0x0a); + send_data_cmd(0x11); + send_data_cmd(0x03); + send_data_cmd(0x08); + send_data_cmd(0x05); + send_data_cmd(0x00); + send_ctrl_cmd(0xE1); + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x1c); + send_data_cmd(0x04); + send_data_cmd(0x10); + send_data_cmd(0x06); + send_data_cmd(0x2d); + send_data_cmd(0x66); + send_data_cmd(0x40); + send_data_cmd(0x05); + send_data_cmd(0x0e); + send_data_cmd(0x0c); + send_data_cmd(0x37); + send_data_cmd(0x34); + send_data_cmd(0x0F); + + ///////////////////////////////////// + ///////////////////////////////////// + ///////gamma 2.5 setting///////////// + /* + send_ctrl_cmd(0xC0); //Power Control 1 + send_data_cmd(0x1D);//VRH[5:0] + send_data_cmd(0x0A);//VC[3:0] + send_ctrl_cmd(0xC1); //Power Control 2 + send_data_cmd(0x01);//SAP[2:0],BT[3:0] + send_ctrl_cmd(0xC2); //Power Control 2 + send_data_cmd(0x22);//SAP[2:0],BT[3:0] + send_ctrl_cmd(0xC5); //VCOM Control 1 + send_data_cmd(0x25);//0x20 VMH[6:0] + send_data_cmd(0x21);//VML[6:0] + send_ctrl_cmd(0xC7); //VCOM Control 2 + send_data_cmd(0xD4);//nVM,VMF[6:0] + send_ctrl_cmd(0xB8); //Oscillator Control + send_data_cmd(0x0B);//FOSC[3:0] + send_ctrl_cmd(0xE0); + send_data_cmd(0x1F);//P01-VP63 + send_data_cmd(0x26);//P02-VP62 + send_data_cmd(0x23);//P03-VP61 + send_data_cmd(0x0A);//P04-VP59 + send_data_cmd(0x10);//P05-VP57 + send_data_cmd(0x09);//P06-VP50 + send_data_cmd(0x51);//P07-VP43 + send_data_cmd(0xA9);//P08-VP27,36 + send_data_cmd(0x3C);//P09-VP20 + send_data_cmd(0x06);//P10-VP13 + send_data_cmd(0x0D);//P11-VP6 + send_data_cmd(0x05);//P12-VP4 + send_data_cmd(0x10);//P13-VP2 + send_data_cmd(0x09);//P14-VP1 + send_data_cmd(0x00);//P15-VP0 + send_ctrl_cmd(0xE1); + send_data_cmd(0x00);//P01 + send_data_cmd(0x19);//P02 + send_data_cmd(0x1C);//P03 + send_data_cmd(0x05);//P04 + send_data_cmd(0x0F);//P05 + send_data_cmd(0x06);//P06 + send_data_cmd(0x2E);//P07 + send_data_cmd(0x36);//P08 + send_data_cmd(0x43);//P09 + send_data_cmd(0x09);//P10 + send_data_cmd(0x12);//P11 + send_data_cmd(0x0A);//P12 + send_data_cmd(0x2F);//P13 + send_data_cmd(0x36);//P14 + send_data_cmd(0x1F);//P15 + */ + ///////////////////////////////////// + send_ctrl_cmd(0x2A); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xEF); + + send_ctrl_cmd(0xF2); + send_data_cmd(0x00); + + send_ctrl_cmd(0x11);//Exit Sleep + MDELAY(80); + send_ctrl_cmd(0x11);//Exit Sleep + MDELAY(80); + + send_ctrl_cmd(0x29);//Display On + MDELAY(20); + + send_ctrl_cmd(0x2C);//Display On + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M;//52 + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + params->dbi.te_mode= 1;//libin changed 1 + params->dbi.te_edge_polarity= 1;// 1 + /////////////////ILI9481 +///////////changed by max + params->dbi.parallel.write_setup = 4; + params->dbi.parallel.write_hold = 4; + params->dbi.parallel.write_wait = 12; + params->dbi.parallel.read_setup = 4; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 1;//0 +} + + +static void lcm_init(void) +{ + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(100); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); // display off + MDELAY(50);// delay for 100ms + send_ctrl_cmd(0x10); // Enter Sleep mode + MDELAY(150); +} + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11);//Exit Sleep + MDELAY(100); + /////////////////////////////////////////// + ////////GRAM data write //////////////////// + ////////////////////////////////////////// + // Display ON Setting// + send_ctrl_cmd(0x29);//Display On + MDELAY(10); + send_ctrl_cmd(0x2C); //Memory Write +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0xD3); // SET password + read_data_cmd(); //dummy read + read_data_cmd(); //dummy read + read_data_cmd(); //dummy read + read_data_cmd(); + return (LCM_ID == read_data_cmd())?1:0; //0x42 +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9342_lcm_drv = +{ + .name = "ili9342", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; + +#ifndef BUILD_UBOOT + +#ifdef JRD_LCD_ESD_RECOVERY + +#include + +extern void jrd_lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height); +extern void jrd_lcd_waitfornotbusy(void); + +static int get_power_setting_status(void) +{ + unsigned int id1,id2; + jrd_lcd_waitfornotbusy(); + + send_ctrl_cmd(0x09); + read_data_cmd(); //dummy read + id1 = read_data_cmd(); // 0x84 + id1 = (id1 << 8) |read_data_cmd(); // 0x63 + id1 = (id1 << 8) |read_data_cmd(); // 0x04 + id1 = (id1 << 8) |read_data_cmd(); // 0x00 + + send_ctrl_cmd(0xc5); + read_data_cmd(); //dummy read + id2 = read_data_cmd(); //20 + id2 = (id2 << 8) | read_data_cmd(); //20 + + send_ctrl_cmd(0xc7); + read_data_cmd(); //dummy read + id2 = (id2<< 8) | read_data_cmd(); //Db + + if( (id1 != 0x84630400) || (id2 != 0x2020db)) + { + printk("---------------------------lcm_init ---------------------------\n"); + lcm_init(); + jrd_lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + } + return 0; +} + +JRD_LCM_ESD ili9342_lcm_esd = +{ + .name = "ili9342", + .get_register_value = get_power_setting_status, +}; + +#endif + +#endif + + + diff --git a/alcatel_ot_916d_jrd73_gb/lcm/ili9481/ili9481.c b/alcatel_ot_916d_jrd73_gb/lcm/ili9481/ili9481.c new file mode 100644 index 0000000..8afaf41 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/ili9481/ili9481.c @@ -0,0 +1,406 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x5466) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ +#if 0 //modify by JRD request + send_ctrl_cmd(0xC0); +send_data_cmd(0x08); +send_data_cmd(0x07); +send_ctrl_cmd(0xC1); +send_data_cmd(0x04); +send_data_cmd(0x04); +send_ctrl_cmd(0xC2); +send_data_cmd(0x33); + +send_ctrl_cmd(0xB1); +send_data_cmd(0xB0); +send_data_cmd(0x11); +send_ctrl_cmd(0xB4); +send_data_cmd(0x02); + +send_ctrl_cmd(0x36); +send_data_cmd(0x48); + +#if 1//just for temple rework lcd + +send_ctrl_cmd(0x3A); +send_data_cmd(0x66); //0x55 ->0x66 when SMT +#endif +send_ctrl_cmd(0xC5); +send_data_cmd(0x00); +send_data_cmd(0x37); +send_data_cmd(0x80); + +send_ctrl_cmd(0xE0); +send_data_cmd(0x0F); +send_data_cmd(0x1B); +send_data_cmd(0x18); +send_data_cmd(0x0B); +send_data_cmd(0x0E); +send_data_cmd(0x09); +send_data_cmd(0x47); +send_data_cmd(0x94); +send_data_cmd(0x35); +send_data_cmd(0x0A); +send_data_cmd(0x13); +send_data_cmd(0x05); +send_data_cmd(0x08); +send_data_cmd(0x03); +send_data_cmd(0x00); + +send_ctrl_cmd(0XE1); +send_data_cmd(0x0F); +send_data_cmd(0x3A); +send_data_cmd(0x37); +send_data_cmd(0x0B); +send_data_cmd(0x0C); +send_data_cmd(0x05); +send_data_cmd(0x4A); +send_data_cmd(0x24); +send_data_cmd(0x39); +send_data_cmd(0x07); +send_data_cmd(0x10); +send_data_cmd(0x04); +send_data_cmd(0x27); +send_data_cmd(0x25); +send_data_cmd(0x00); + +send_ctrl_cmd(0XF8); +send_data_cmd(0x21); +send_data_cmd(0x04); + +send_ctrl_cmd(0x11); +send_ctrl_cmd(0X35); //libin temp change for te +send_data_cmd(0x00); +MDELAY(120); +send_ctrl_cmd(0x29); + send_ctrl_cmd(0x2c); + #endif + send_ctrl_cmd(0x36);//set address mode + send_data_cmd(0x48); + + send_ctrl_cmd(0x3A); //pixel format + send_data_cmd(0x66);//0x55-16bits,0x66-18bits + //send_data_cmd(0x55);//0x55-16bits,0x66-18bits + + //gamma 2.2 setting + send_ctrl_cmd(0xE0); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x08); + send_data_cmd(0x0F); + send_data_cmd(0x06); + send_data_cmd(0x14); + send_data_cmd(0x0A); + send_data_cmd(0x3A); + send_data_cmd(0x9A); + send_data_cmd(0x49); + send_data_cmd(0x0A); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x1B); + send_data_cmd(0x1E); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE1); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x21); + send_data_cmd(0x24); + send_data_cmd(0x02); + send_data_cmd(0x08); + send_data_cmd(0x05); + send_data_cmd(0x36); + send_data_cmd(0x56); + send_data_cmd(0x45); + send_data_cmd(0x05); + send_data_cmd(0x0B); + send_data_cmd(0x09); + send_data_cmd(0x30); + send_data_cmd(0x37); + send_data_cmd(0x0F); + + + send_ctrl_cmd(0xf2); + send_data_cmd(0x18); + send_data_cmd(0xa3); + send_data_cmd(0x12); + send_data_cmd(0x02); + send_data_cmd(0xB2); + send_data_cmd(0x52); //0x12-->0x92-->0x52 + send_data_cmd(0xff); + send_data_cmd(0x10); + + + send_ctrl_cmd(0xf7); + send_data_cmd(0xa9); + send_data_cmd(0x91); + send_data_cmd(0x2d); + send_data_cmd(0x0a); + send_data_cmd(0x4f); + + send_ctrl_cmd(0xf4); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x08); + send_data_cmd(0x91); + send_data_cmd(0x04); + + send_ctrl_cmd(0xf8); + send_data_cmd(0x21); + send_data_cmd(0x04); + + send_ctrl_cmd(0xf9); + send_data_cmd(0x00); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB4); //Set 2Dot Invertion + send_data_cmd(0x02); + + send_ctrl_cmd(0xB1); //Set Frame Rate + send_data_cmd(0xB0); + send_data_cmd(0x11); + + send_ctrl_cmd(0x20); //Display Inversion OFF + + send_ctrl_cmd(0xc0); + send_data_cmd(0x0D); + send_data_cmd(0x0D); + + + send_ctrl_cmd(0xc1); + send_data_cmd(0x44); + + send_ctrl_cmd(0xB7); + send_data_cmd(0xC6); + + send_ctrl_cmd(0xc5); + send_data_cmd(0x00); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2A); //display area column setting + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2B); //display area page setting + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0xE0); + + + + send_ctrl_cmd(0x11);//exit sleep mode + + send_ctrl_cmd(0X35); //libin temp change for te + send_data_cmd(0x00); + + MDELAY(150); + + send_ctrl_cmd(0x29); //Display on + + MDELAY(20); + + send_ctrl_cmd(0x2C); //memary write +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + params->dbi.te_mode= 1;//libin changed + params->dbi.te_edge_polarity= 1; + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 3; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(100); + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(150); + send_ctrl_cmd(0x29); + MDELAY(50); + send_ctrl_cmd(0x2c); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int lcm_compare_id(void) +{ + + unsigned int id=0; + + + send_ctrl_cmd(0x04); + + + read_data_cmd(); //dummy code:0 + + unsigned int param1 = 0; + param1 =read_data_cmd(); //manufacturer id + + read_data_cmd(); + + unsigned int param2 =0; + param2 = read_data_cmd(); //module/driver id + + id = ((param1 & LCM_ID_MASK)<<8)|(param2); + + + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/inc/lcm_drv.h b/alcatel_ot_916d_jrd73_gb/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..d269d82 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/inc/lcm_drv.h @@ -0,0 +1,418 @@ + + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + +#define JRD_LCD_ESD_RECOVERY 1 + +typedef struct +{ + const char* name; + unsigned int (*get_register_value)(void); +} JRD_LCM_ESD; + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_latency; + unsigned int wait_period; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + LCM_LANE_NUM LANE_NUM; + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned int pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + unsigned int (*check_status)(void); +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/alcatel_ot_916d_jrd73_gb/lcm/lg4571/lg4571.c b/alcatel_ot_916d_jrd73_gb/lcm/lg4571/lg4571.c new file mode 100644 index 0000000..3d9fe2a --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/lg4571/lg4571.c @@ -0,0 +1,333 @@ + + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/mt65xx_lcm_list.c b/alcatel_ot_916d_jrd73_gb/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..6aedf59 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/mt65xx_lcm_list.c @@ -0,0 +1,86 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER zte6516_lcm_drv; +extern LCM_DRIVER ili9342_lcm_drv; +extern LCM_DRIVER hx8368a_lcm_drv; + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(ZTE6516) + &zte6516_lcm_drv, +#endif + +#if defined(HX8368A) + &hx8368a_lcm_drv, +#endif + +#if defined(ILI9342) + &ili9342_lcm_drv +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/alcatel_ot_916d_jrd73_gb/lcm/mtk_cust.mk b/alcatel_ot_916d_jrd73_gb/lcm/mtk_cust.mk new file mode 100755 index 0000000..48c1fe1 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/mtk_cust.mk @@ -0,0 +1,2 @@ +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/alcatel_ot_916d_jrd73_gb/lcm/nt35582/nt35582.c b/alcatel_ot_916d_jrd73_gb/lcm/nt35582/nt35582.c new file mode 100644 index 0000000..8de5935 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/nt35582/nt35582.c @@ -0,0 +1,326 @@ + + +#include + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c b/alcatel_ot_916d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..17d71cc --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,395 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x05);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.wait_period = 1; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/s6d0170/s6d0170.c b/alcatel_ot_916d_jrd73_gb/lcm/s6d0170/s6d0170.c new file mode 100644 index 0000000..0b74ae7 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/s6d0170/s6d0170.c @@ -0,0 +1,304 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/spfd5461a/spfd5461a.c b/alcatel_ot_916d_jrd73_gb/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..39d3f92 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,352 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/ta7601/ta7601.c b/alcatel_ot_916d_jrd73_gb/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..d24d640 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/ta7601/ta7601.c @@ -0,0 +1,285 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/tft1p3037/tft1p3037.c b/alcatel_ot_916d_jrd73_gb/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..efa67b0 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,316 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/tft3p4039/tft3p4039.c b/alcatel_ot_916d_jrd73_gb/lcm/tft3p4039/tft3p4039.c new file mode 100644 index 0000000..49bc8a2 --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/tft3p4039/tft3p4039.c @@ -0,0 +1,351 @@ + + +#include +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define LCM_ID (0x8357) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +//static unsigned int lcm_compare_id(void); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + MDELAY(10); + send_ctrl_cmd(0X0011); //SLEEP OUT + MDELAY(120); + + send_ctrl_cmd(0X00EE); //SET EQ + send_data_cmd(0X0002); + send_data_cmd(0X0001); + send_data_cmd(0X0002); + send_data_cmd(0X0001); + + send_ctrl_cmd(0xED);//Set DIR TIM + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x9A); + send_data_cmd(0x9A); + send_data_cmd(0x9B); + send_data_cmd(0x9B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x01); + send_data_cmd(0xA2); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB4);//Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC0); //Set Panel Driving + send_data_cmd(0x10); //REV SM GS + send_data_cmd(0x3B); // NL[5:0] + send_data_cmd(0x00); //SCN[6:0] + send_data_cmd(0x02); //NDL 0 PTS[2:0] + send_data_cmd(0x11); //PTG ISC[3:0] + + send_ctrl_cmd(0xC8);//Set Gamma + send_data_cmd(0x00); //KP1,KP0 + send_data_cmd(0x46); //KP3,KP2 + send_data_cmd(0x12); //KP5,KP4 + send_data_cmd(0x20); //RP1,RP0 + send_data_cmd(0x0c); //VRP0 01 + send_data_cmd(0x00); //VRP1 + send_data_cmd(0x56); //KN1,KN0 + send_data_cmd(0x12); //KN3,KN2 + send_data_cmd(0x67); //KN5,KN4 + send_data_cmd(0x02); //RN1,RN0 + send_data_cmd(0x00); //VRN0 + send_data_cmd(0x0c); //VRN1 01 + + + send_ctrl_cmd(0xD0);//Set Power + send_data_cmd(0x44);//DDVDH :5.28 + send_data_cmd(0x44); // BT VGH:15.84 VGL:-7.92 + send_data_cmd(0x05);//VREG1 4.625V + + + send_ctrl_cmd(0xD1);//Set VCOM + send_data_cmd(0x4b); //VCOMH 3.367 //3B + send_data_cmd(0x14);//VCOM 5.2725 + + send_ctrl_cmd(0xD2); + send_data_cmd(0x04); + send_data_cmd(0x22); //12 + + send_ctrl_cmd(0xD3); + send_data_cmd(0x04); + send_data_cmd(0x12); + + send_ctrl_cmd(0xD4); + send_data_cmd(0x07); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x00); + + send_ctrl_cmd(0xC5); //Set Frame rate + send_data_cmd(0x08); //61.51Hz + + + send_ctrl_cmd(0X0036); + send_data_cmd(0X000a); + + send_ctrl_cmd(0X003A); + send_data_cmd(0X0006); + + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00E0); + MDELAY(120); + + send_ctrl_cmd(0x29); //Display On + MDELAY(5); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; //? + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; // im0 im1:00 + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + + params->dbi.parallel.write_setup = 2;//t(ast)=10ns + params->dbi.parallel.write_hold = 3; //t(wrh)/8-1=30ns + params->dbi.parallel.write_wait = 4; //(25+10)/8-1 + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 22; //(10+170)/8-2 + params->dbi.parallel.wait_period = 0;//t(rdh) + params->dbi.te_mode= LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity= LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0001); // Set as 1-th scanline, line lsb first + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x0028); + send_ctrl_cmd(0x0010); + MDELAY(10); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x0011); + MDELAY(120); + send_ctrl_cmd(0x0029); + +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + + +static unsigned int lcm_compare_id(void) +{ + + unsigned int id = 0; + + send_ctrl_cmd(0xBF); + + + read_data_cmd(); //dummy code:0 + + read_data_cmd(); //MIPI:0x1 + + read_data_cmd();//MIPI: 0x62 + + unsigned int param1 =0; + param1 = read_data_cmd(); //should 0x83 + + unsigned int param2 = 0; + param2 =read_data_cmd();//should 0x57 + + read_data_cmd(); //should 0xff + + id = ((param1&LCM_ID_MASK)<< 8)| (param2&LCM_ID_MASK); + + + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft3p4039_lcm_drv = +{ + .name = "tft3p4039", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_916d_jrd73_gb/lcm/zte6516/zte6516.c b/alcatel_ot_916d_jrd73_gb/lcm/zte6516/zte6516.c new file mode 100644 index 0000000..d5ef25a --- /dev/null +++ b/alcatel_ot_916d_jrd73_gb/lcm/zte6516/zte6516.c @@ -0,0 +1,314 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (240) +#define LCM_ID (0x57) +// --------------------------------------------------------------------------- +// Local Variables: +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (10) +#define POWER_ON_SEQ_DELAY (200) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0x00FF & (lcm_util.read_data() >> 1); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd((regIndex & 0x00FF) << 1); + send_data_cmd((regData & 0x00FF) << 1); +} + + +static void init_lcm_registers(void) +{ + + + //=======wenbo add============== + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x0072, 0x00F6); + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x00F2, 0x0000); + set_lcm_register(0x00E4, 0x0000); + set_lcm_register(0x00E5, 0x001C); + set_lcm_register(0x00E6, 0x0000); + set_lcm_register(0x00E7, 0x001C); + set_lcm_register(0x00EE, 0x0042); + set_lcm_register(0x00EF, 0x00DB); + set_lcm_register(0x002E, 0x0098); + set_lcm_register(0x0040, 0x0000); + set_lcm_register(0x0041, 0x002E); + set_lcm_register(0x0042, 0x002D); + set_lcm_register(0x0043, 0x003F); + set_lcm_register(0x0044, 0x003F); + set_lcm_register(0x0045, 0x003F); + set_lcm_register(0x0046, 0x002C); + set_lcm_register(0x0047, 0x007F); + set_lcm_register(0x0048, 0x0007); + set_lcm_register(0x0049, 0x0005); + set_lcm_register(0x004A, 0x0008); + set_lcm_register(0x004B, 0x0013); + set_lcm_register(0x004C, 0x001E); + set_lcm_register(0x0050, 0x0000); + set_lcm_register(0x0051, 0x0000); + set_lcm_register(0x0052, 0x0000); + set_lcm_register(0x0053, 0x0012); + set_lcm_register(0x0054, 0x0011); + set_lcm_register(0x0055, 0x003F); + set_lcm_register(0x0056, 0x0000); + set_lcm_register(0x0057, 0x0053); + set_lcm_register(0x0058, 0x0001); + set_lcm_register(0x0059, 0x000C); + set_lcm_register(0x005A, 0x0017); + set_lcm_register(0x005B, 0x001A); + set_lcm_register(0x005C, 0x0018); + set_lcm_register(0x005D, 0x00C3); + set_lcm_register(0x0002, 0x0000); + set_lcm_register(0x0003, 0x0000); + set_lcm_register(0x0004, 0x0001); + set_lcm_register(0x0005, 0x003F); + set_lcm_register(0x0006, 0x0000); + set_lcm_register(0x0007, 0x0000); + set_lcm_register(0x0008, 0x0000); + set_lcm_register(0x0009, 0x00EF); // + set_lcm_register(0x0024, 0x0022); + set_lcm_register(0x0025, 0x0064); + set_lcm_register(0x0023, 0x0090); + set_lcm_register(0x001B, 0x000E); + set_lcm_register(0x001D, 0x0011); + set_lcm_register(0x0019, 0x0001); + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x0001, 0x0000); + set_lcm_register(0x001F, 0x0080); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x0090); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x00D4); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x0028, 0x0008); + MDELAY(40); + set_lcm_register(0x0028, 0x0038); + MDELAY(40); //DELAY 40MS + set_lcm_register(0x0028, 0x003C); + //wr_com(0x0016, 0x0020); //0020 + set_lcm_register(0x0017, 0x0006); //18bit + send_ctrl_cmd(0x0022 << 1); + //===========wenbo add end========= + + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; //LCM_DBI_CLOCK_FREQ_52M + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2;//1; //0 + params->dbi.parallel.write_hold = 1; ////3 33 + params->dbi.parallel.write_wait = 3; //3// + params->dbi.parallel.read_setup = 0; ////2 + params->dbi.parallel.read_latency = 10; ////19 + params->dbi.parallel.wait_period = 0; ////0 +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + + static void lcm_suspend(void) + { + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0004); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0000); + + set_lcm_register(0x001F, 0x0089); + + set_lcm_register(0x0019, 0x0000); + + + /* set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); + */ + } + + + +static void lcm_resume(void) + { + + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0019, 0x0001); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x001F, 0x0080); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x00D4); + + MDELAY(5); + + set_lcm_register(0x0028, 0x0008); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x003C); + + /* set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); + */ + } + + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) + { + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x0022 << 1); + } + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER zte6516_lcm_drv = +{ + .name = "zte6516", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/bm8578/bm8578.c b/alcatel_ot_918d_jrd73_gb/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..e7283e3 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/bm8578/bm8578.c @@ -0,0 +1,271 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/dummy/dummy.c b/alcatel_ot_918d_jrd73_gb/lcm/dummy/dummy.c new file mode 100644 index 0000000..9e80fd4 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/dummy/dummy.c @@ -0,0 +1,112 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/alcatel_ot_918d_jrd73_gb/lcm/hx8357B/hx8357b.c b/alcatel_ot_918d_jrd73_gb/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..10df35a --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/hx8357B/hx8357b.c @@ -0,0 +1,407 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8357) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +#if 0 + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +#else + MDELAY(10); + send_ctrl_cmd(0x11);//Sleep Out + MDELAY(120); + + send_ctrl_cmd(0xEE);//Set EQ + send_data_cmd(0x02); + send_data_cmd(0x01); + send_data_cmd(0x02); + send_data_cmd(0x01); + + send_ctrl_cmd(0xED);//Set DIR TIM + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x9A); + send_data_cmd(0x9A); + send_data_cmd(0x9B); + send_data_cmd(0x9B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x01); + send_data_cmd(0xA2); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB4);//Set RM, DM + send_data_cmd(0x00);// + + send_ctrl_cmd(0xC0); //Set Panel Driving + send_data_cmd(0x10); //REV SM GS + send_data_cmd(0x3B); // NL[5:0] + send_data_cmd(0x00); //SCN[6:0] + send_data_cmd(0x02); //NDL 0 PTS[2:0] + send_data_cmd(0x11); //PTG ISC[3:0] + + send_ctrl_cmd(0xC8);//Set Gamma + send_data_cmd(0x00); //KP1,KP0 + send_data_cmd(0x46); //KP3,KP2 + send_data_cmd(0x12); //KP5,KP4 + send_data_cmd(0x20); //RP1,RP0 + send_data_cmd(0x0c); //VRP0 01 + send_data_cmd(0x00); //VRP1 + send_data_cmd(0x56); //KN1,KN0 + send_data_cmd(0x12); //KN3,KN2 + send_data_cmd(0x67); //KN5,KN4 + send_data_cmd(0x02); //RN1,RN0 + send_data_cmd(0x00); //VRN0 + send_data_cmd(0x0c); //VRN1 01 + + send_ctrl_cmd(0xD0);//Set Power + send_data_cmd(0x44);//DDVDH :5.28 + send_data_cmd(0x44); // BT VGH:15.84 VGL:-7.92 + send_data_cmd(0x05);//VREG1 4.625V + + send_ctrl_cmd(0xD1);//Set VCOM + send_data_cmd(0x4b); //VCOMH 3.367 //3B + send_data_cmd(0x14);//VCOM 5.2725 + + send_ctrl_cmd(0xD2); + send_data_cmd(0x04); + send_data_cmd(0x22); //12 + + send_ctrl_cmd(0xD3); + send_data_cmd(0x04); + send_data_cmd(0x12); + + send_ctrl_cmd(0xD4); + send_data_cmd(0x07); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x00); + + send_ctrl_cmd(0xC5); //Set Frame rate + send_data_cmd(0x08); //61.51Hz + + + send_ctrl_cmd(0X0036); + send_data_cmd(0X000a); + + send_ctrl_cmd(0X003A); + send_data_cmd(0X0006); + + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00E0); + MDELAY(120); + + send_ctrl_cmd(0x29); //Display On + MDELAY(5); +#endif +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id; + send_ctrl_cmd(0xBF); // SET password + read_data_cmd(); //dummy read + read_data_cmd(); //01 + read_data_cmd(); //62 + id= read_data_cmd(); //83 + id= ( id<< 8 ) | read_data_cmd(); //57 + read_data_cmd(); //ff + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + //.set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/hx8369/hx8369.c b/alcatel_ot_918d_jrd73_gb/lcm/hx8369/hx8369.c new file mode 100644 index 0000000..f061796 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/hx8369/hx8369.c @@ -0,0 +1,533 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +#if defined(LCM_DSI_CMD_MODE) + { + data_array[0]=0x00043902; + data_array[1]=0x6983FFB9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00103902; + data_array[1]=0x032000B2; + data_array[2]=0xFF007003; + data_array[3]=0x00000000; + data_array[4]=0x01000303; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0]=0x00063902; + data_array[1]=0x700800B4; + data_array[2]=0x0000060E; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; + data_array[1] = 0x030100D5; + data_array[2] = 0x08020100; + data_array[3] = 0x00131180; + data_array[4] = 0x51064000; + data_array[5] = 0x71000007; + data_array[6] = 0x07046005; + data_array[7] = 0x0000060F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00143902; + data_array[1] = 0x340085B1; + data_array[2] = 0x0E0E0006; + data_array[3] = 0x1A1A2C24; + data_array[4] = 0xE6013A07; + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + // color format + { + // RGB565 + //data_array[0] = 0x053A1500; + // RGB666 + //data_array[0] = 0x063A1500; + // RGB888 + data_array[0] = 0x073A1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } + + data_array[0] = 0x02CC1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00033902; + data_array[1] = 0x006C6CB6 ; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + // ENABLE FMARK + //data_array[0] = 0x00023902; + //data_array[1] = 0x00000035 ; + //dsi_set_cmdq(&data_array, 2, 1); + //MDELAY(10); + + //data_array[0] = 0x00351500; + //dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(10); + + // SET GAMMA + data_array[0] = 0x00233902; + data_array[1] = 0x140C00E0; + data_array[2] = 0x293F3F3F; + data_array[3] = 0x0F0C0654; + data_array[4] = 0x15131513; + data_array[5] = 0x0C001F14; + data_array[6] = 0x3F3F3F14; + data_array[7] = 0x0C065429; + data_array[8] = 0x1315130F; + data_array[9] = 0x001F1415; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + + data_array[0] = 0x000E3902; //// SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA ; + data_array[2] = 0x10000A00 ; + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018 ; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + } +#else + { + data_array[0] = 0x00043902; // SET password + data_array[1] = 0x6983FFB9; // + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x00143902; //// SET Power + data_array[1] = 0x340085B1; // + data_array[2] = 0x0F0F0007; // + data_array[3] = 0x3F3F322A; // + data_array[4] = 0xE6013A01; // + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + data_array[0] = 0x00103902; //// SET Display 480x800 + data_array[1] = 0x032300B2; // + data_array[2] = 0xFF007003; // + data_array[3] = 0x00000000; // + data_array[4] = 0x01000303; // + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00063902; // SET Display + data_array[1] = 0x801800B4; + data_array[2] = 0x00000206; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x00033902; //// SET VCOM + data_array[1] = 0x004242B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; //// SET GIP + data_array[1] = 0x030400D5; + data_array[2] = 0x28050100; + data_array[3] = 0x00030170; + data_array[4] = 0x51064000; + data_array[5] = 0x41000007; + data_array[6] = 0x07075006; + data_array[7] = 0x0000040F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00233902; //// SET GAMMA + data_array[1] = 0x191300E0; // + data_array[2] = 0x283F3D38; // + data_array[3] = 0x0E0D0746; // + data_array[4] = 0x14121512; // + data_array[5] = 0x1300170F; + data_array[6] = 0x3F3D3819; + data_array[7] = 0x0D074628; + data_array[8] = 0x1215120E; + data_array[9] = 0x00170F14; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + +#if 0 + switch(g_ColorFormat) + { + case PACKED_RGB565: + data_array[0] = 0x553A1500; // SET pixel format + break; + + case LOOSED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + case PACKED_RGB888: + data_array[0] = 0x773A1500; // SET pixel format + break; + + case PACKED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + default: + //dbg_print("Format setting error \n\r"); + while(1); + break; + } + + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +#endif + data_array[0] = 0x000E3902; // SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA; // + data_array[2] = 0x10000A00; // + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } +#endif + //------------------------------------------------------------------------ + // LUT for HX8369 + //------------------------------------------------------------------------ + if (1)//(g_ColorFormat==0) + { + data_array[0] = 0x00C13902; //Set Color LUT 1 + data_array[1] = 0x1008002D; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000FF; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT 2 + data_array[1] = 0x08040000; + data_array[2] = 0x1814100C; + data_array[3] = 0x2824201C; + data_array[4] = 0x3834302C; + data_array[5] = 0x4844403C; + data_array[6] = 0x5854504C; + data_array[7] = 0x6864605C; + data_array[8] = 0x7874706C; + data_array[9] = 0x8884807C; + data_array[10] = 0x9894908C; + data_array[11] = 0xA8A4A09C; + data_array[12] = 0xB8B4B0AC; + data_array[13] = 0xC8C4C0BC; + data_array[14] = 0xD8D4D0CC; + data_array[15] = 0xE8E4E0DC; + dsi_set_cmdq(&data_array, 16, 1); + + MDELAY(10); + + data_array[0] = 0xF8F4F0EC; //Set Color LUT 3 + data_array[1] = 0x100800FC; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000F8; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT + data_array[1] = 0x00000000; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + } + +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // DBI + //params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // DPI + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.intermediat_buffer_num = 2; + + // DSI + params->dsi.DSI_WMEM_CONTI=0x3C; + params->dsi.DSI_RMEM_CONTI=0x3E; + //params->dsi.LANE_NUM=LCM_ONE_LANE; + params->dsi.LANE_NUM=LCM_TWO_LANE; + params->dsi.VC_NUM=0x0; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + params->dsi.HS_TRAIL=0x14; + params->dsi.HS_ZERO=0x14; + params->dsi.HS_PRPR=0x0A; + params->dsi.LPX=0x05; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x37; + params->dsi.TA_SURE=0x16; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x14; + params->dsi.CLK_ZERO=0x14; + params->dsi.LPX_WAIT=0x0A; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x0A; + + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + + //params->dsi.pll_div2=4; // div2=0~15: fout=fvo/(2*div2) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + //data_array[6]= 0x002c3901; + + dsi_set_cmdq(&data_array, 7, 0); + +} + +LCM_DRIVER hx8369_dsi_lcm_drv = +{ + .name = "hx8369_dsi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if defined(LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif + }; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c b/alcatel_ot_918d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c new file mode 100644 index 0000000..34e001e --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/hx8369_hvga/hx8369_hvga.c @@ -0,0 +1,573 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x5466) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ +#if 0 //modify by JRD request + send_ctrl_cmd(0xC0); +send_data_cmd(0x08); +send_data_cmd(0x07); +send_ctrl_cmd(0xC1); +send_data_cmd(0x04); +send_data_cmd(0x04); +send_ctrl_cmd(0xC2); +send_data_cmd(0x33); + +send_ctrl_cmd(0xB1); +send_data_cmd(0xB0); +send_data_cmd(0x11); +send_ctrl_cmd(0xB4); +send_data_cmd(0x02); + +send_ctrl_cmd(0x36); +send_data_cmd(0x48); + +#if 1//just for temple rework lcd + +send_ctrl_cmd(0x3A); +send_data_cmd(0x66); //0x55 ->0x66 when SMT +#endif +send_ctrl_cmd(0xC5); +send_data_cmd(0x00); +send_data_cmd(0x37); +send_data_cmd(0x80); + +send_ctrl_cmd(0xE0); +send_data_cmd(0x0F); +send_data_cmd(0x1B); +send_data_cmd(0x18); +send_data_cmd(0x0B); +send_data_cmd(0x0E); +send_data_cmd(0x09); +send_data_cmd(0x47); +send_data_cmd(0x94); +send_data_cmd(0x35); +send_data_cmd(0x0A); +send_data_cmd(0x13); +send_data_cmd(0x05); +send_data_cmd(0x08); +send_data_cmd(0x03); +send_data_cmd(0x00); + +send_ctrl_cmd(0XE1); +send_data_cmd(0x0F); +send_data_cmd(0x3A); +send_data_cmd(0x37); +send_data_cmd(0x0B); +send_data_cmd(0x0C); +send_data_cmd(0x05); +send_data_cmd(0x4A); +send_data_cmd(0x24); +send_data_cmd(0x39); +send_data_cmd(0x07); +send_data_cmd(0x10); +send_data_cmd(0x04); +send_data_cmd(0x27); +send_data_cmd(0x25); +send_data_cmd(0x00); + +send_ctrl_cmd(0XF8); +send_data_cmd(0x21); +send_data_cmd(0x04); + +send_ctrl_cmd(0x11); +send_ctrl_cmd(0X35); //libin temp change for te +send_data_cmd(0x00); +MDELAY(120); +send_ctrl_cmd(0x29); + send_ctrl_cmd(0x2c); + #endif + send_ctrl_cmd(0x36);//set address mode + send_data_cmd(0x48); + + send_ctrl_cmd(0x3A); //pixel format + send_data_cmd(0x66);//0x55-16bits,0x66-18bits + //send_data_cmd(0x55);//0x55-16bits,0x66-18bits + + //gamma 2.2 setting + send_ctrl_cmd(0xE0); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x08); + send_data_cmd(0x0F); + send_data_cmd(0x06); + send_data_cmd(0x14); + send_data_cmd(0x0A); + send_data_cmd(0x3A); + send_data_cmd(0x9A); + send_data_cmd(0x49); + send_data_cmd(0x0A); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x1B); + send_data_cmd(0x1E); + send_data_cmd(0x0F); + + send_ctrl_cmd(0xE1); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x21); + send_data_cmd(0x24); + send_data_cmd(0x02); + send_data_cmd(0x08); + send_data_cmd(0x05); + send_data_cmd(0x36); + send_data_cmd(0x56); + send_data_cmd(0x45); + send_data_cmd(0x05); + send_data_cmd(0x0B); + send_data_cmd(0x09); + send_data_cmd(0x30); + send_data_cmd(0x37); + send_data_cmd(0x0F); + + + send_ctrl_cmd(0xf2); + send_data_cmd(0x18); + send_data_cmd(0xa3); + send_data_cmd(0x12); + send_data_cmd(0x02); + send_data_cmd(0xB2); + send_data_cmd(0x52); //0x12-->0x92-->0x52 + send_data_cmd(0xff); + send_data_cmd(0x10); + + + send_ctrl_cmd(0xf7); + send_data_cmd(0xa9); + send_data_cmd(0x91); + send_data_cmd(0x2d); + send_data_cmd(0x0a); + send_data_cmd(0x4f); + + send_ctrl_cmd(0xf4); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x08); + send_data_cmd(0x91); + send_data_cmd(0x04); + + send_ctrl_cmd(0xf8); + send_data_cmd(0x21); + send_data_cmd(0x04); + + send_ctrl_cmd(0xf9); + send_data_cmd(0x00); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB4); //Set 2Dot Invertion + send_data_cmd(0x02); + + send_ctrl_cmd(0xB1); //Set Frame Rate + send_data_cmd(0xB0); + send_data_cmd(0x11); + + send_ctrl_cmd(0x20); //Display Inversion OFF + + send_ctrl_cmd(0xc0); + send_data_cmd(0x0D); + send_data_cmd(0x0D); + + + send_ctrl_cmd(0xc1); + send_data_cmd(0x44); + + send_ctrl_cmd(0xB7); + send_data_cmd(0xC6); + + send_ctrl_cmd(0xc5); + send_data_cmd(0x00); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2A); //display area column setting + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2B); //display area page setting + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0xE0); + + + + send_ctrl_cmd(0x11);//exit sleep mode + + send_ctrl_cmd(0X35); //libin temp change for te + send_data_cmd(0x00); + + MDELAY(150); + + send_ctrl_cmd(0x29); //Display on + + MDELAY(20); + + send_ctrl_cmd(0x2C); //memary write +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + params->dbi.te_mode= 1;//libin changed + params->dbi.te_edge_polarity= 1; + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 3; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(100); + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(150); + send_ctrl_cmd(0x29); + MDELAY(50); + send_ctrl_cmd(0x2c); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int lcm_compare_id(void) +{ + + unsigned int id=0; + + + send_ctrl_cmd(0x04); + + + read_data_cmd(); //dummy code:0 + + unsigned int param1 = 0; + param1 =read_data_cmd(); //manufacturer id + + read_data_cmd(); + + unsigned int param2 =0; + param2 = read_data_cmd(); //module/driver id + + id = ((param1 & LCM_ID_MASK)<<8)|(param2); + + + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/inc/lcm_drv.h b/alcatel_ot_918d_jrd73_gb/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..e390d06 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/inc/lcm_drv.h @@ -0,0 +1,411 @@ + + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_latency; + unsigned int wait_period; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + LCM_LANE_NUM LANE_NUM; + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned int pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + unsigned int (*check_status)(void); +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/alcatel_ot_918d_jrd73_gb/lcm/lg4571/lg4571.c b/alcatel_ot_918d_jrd73_gb/lcm/lg4571/lg4571.c new file mode 100644 index 0000000..3d9fe2a --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/lg4571/lg4571.c @@ -0,0 +1,333 @@ + + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/mt65xx_lcm_list.c b/alcatel_ot_918d_jrd73_gb/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..4820c60 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/mt65xx_lcm_list.c @@ -0,0 +1,80 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER zte6516_lcm_drv; +extern LCM_DRIVER tft3p4039_lcm_drv; + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(ZTE6516) + &zte6516_lcm_drv, +#endif +#if defined(TFT3P4039) + &tft3p4039_lcm_drv +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/alcatel_ot_918d_jrd73_gb/lcm/mtk_cust.mk b/alcatel_ot_918d_jrd73_gb/lcm/mtk_cust.mk new file mode 100755 index 0000000..48c1fe1 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/mtk_cust.mk @@ -0,0 +1,2 @@ +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/alcatel_ot_918d_jrd73_gb/lcm/nt35582/nt35582.c b/alcatel_ot_918d_jrd73_gb/lcm/nt35582/nt35582.c new file mode 100644 index 0000000..8de5935 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/nt35582/nt35582.c @@ -0,0 +1,326 @@ + + +#include + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c b/alcatel_ot_918d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..17d71cc --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,395 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x05);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.wait_period = 1; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/s6d0170/s6d0170.c b/alcatel_ot_918d_jrd73_gb/lcm/s6d0170/s6d0170.c new file mode 100644 index 0000000..0b74ae7 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/s6d0170/s6d0170.c @@ -0,0 +1,304 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/spfd5461a/spfd5461a.c b/alcatel_ot_918d_jrd73_gb/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..39d3f92 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,352 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/ta7601/ta7601.c b/alcatel_ot_918d_jrd73_gb/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..d24d640 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/ta7601/ta7601.c @@ -0,0 +1,285 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/tft1p3037/tft1p3037.c b/alcatel_ot_918d_jrd73_gb/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..efa67b0 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,316 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/tft3p4039/tft3p4039.c b/alcatel_ot_918d_jrd73_gb/lcm/tft3p4039/tft3p4039.c new file mode 100644 index 0000000..49bc8a2 --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/tft3p4039/tft3p4039.c @@ -0,0 +1,351 @@ + + +#include +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define LCM_ID (0x8357) +#define LCM_ID_MASK (0xFF) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +//static unsigned int lcm_compare_id(void); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + MDELAY(10); + send_ctrl_cmd(0X0011); //SLEEP OUT + MDELAY(120); + + send_ctrl_cmd(0X00EE); //SET EQ + send_data_cmd(0X0002); + send_data_cmd(0X0001); + send_data_cmd(0X0002); + send_data_cmd(0X0001); + + send_ctrl_cmd(0xED);//Set DIR TIM + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x9A); + send_data_cmd(0x9A); + send_data_cmd(0x9B); + send_data_cmd(0x9B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x01); + send_data_cmd(0xA2); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB4);//Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC0); //Set Panel Driving + send_data_cmd(0x10); //REV SM GS + send_data_cmd(0x3B); // NL[5:0] + send_data_cmd(0x00); //SCN[6:0] + send_data_cmd(0x02); //NDL 0 PTS[2:0] + send_data_cmd(0x11); //PTG ISC[3:0] + + send_ctrl_cmd(0xC8);//Set Gamma + send_data_cmd(0x00); //KP1,KP0 + send_data_cmd(0x46); //KP3,KP2 + send_data_cmd(0x12); //KP5,KP4 + send_data_cmd(0x20); //RP1,RP0 + send_data_cmd(0x0c); //VRP0 01 + send_data_cmd(0x00); //VRP1 + send_data_cmd(0x56); //KN1,KN0 + send_data_cmd(0x12); //KN3,KN2 + send_data_cmd(0x67); //KN5,KN4 + send_data_cmd(0x02); //RN1,RN0 + send_data_cmd(0x00); //VRN0 + send_data_cmd(0x0c); //VRN1 01 + + + send_ctrl_cmd(0xD0);//Set Power + send_data_cmd(0x44);//DDVDH :5.28 + send_data_cmd(0x44); // BT VGH:15.84 VGL:-7.92 + send_data_cmd(0x05);//VREG1 4.625V + + + send_ctrl_cmd(0xD1);//Set VCOM + send_data_cmd(0x4b); //VCOMH 3.367 //3B + send_data_cmd(0x14);//VCOM 5.2725 + + send_ctrl_cmd(0xD2); + send_data_cmd(0x04); + send_data_cmd(0x22); //12 + + send_ctrl_cmd(0xD3); + send_data_cmd(0x04); + send_data_cmd(0x12); + + send_ctrl_cmd(0xD4); + send_data_cmd(0x07); + send_data_cmd(0x12); + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x00); + + send_ctrl_cmd(0xC5); //Set Frame rate + send_data_cmd(0x08); //61.51Hz + + + send_ctrl_cmd(0X0036); + send_data_cmd(0X000a); + + send_ctrl_cmd(0X003A); + send_data_cmd(0X0006); + + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00E0); + MDELAY(120); + + send_ctrl_cmd(0x29); //Display On + MDELAY(5); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; //? + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; // im0 im1:00 + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + + params->dbi.parallel.write_setup = 2;//t(ast)=10ns + params->dbi.parallel.write_hold = 3; //t(wrh)/8-1=30ns + params->dbi.parallel.write_wait = 4; //(25+10)/8-1 + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 22; //(10+170)/8-2 + params->dbi.parallel.wait_period = 0;//t(rdh) + params->dbi.te_mode= LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity= LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0001); // Set as 1-th scanline, line lsb first + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x0028); + send_ctrl_cmd(0x0010); + MDELAY(10); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x0011); + MDELAY(120); + send_ctrl_cmd(0x0029); + +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + + +static unsigned int lcm_compare_id(void) +{ + + unsigned int id = 0; + + send_ctrl_cmd(0xBF); + + + read_data_cmd(); //dummy code:0 + + read_data_cmd(); //MIPI:0x1 + + read_data_cmd();//MIPI: 0x62 + + unsigned int param1 =0; + param1 = read_data_cmd(); //should 0x83 + + unsigned int param2 = 0; + param2 =read_data_cmd();//should 0x57 + + read_data_cmd(); //should 0xff + + id = ((param1&LCM_ID_MASK)<< 8)| (param2&LCM_ID_MASK); + + + return (LCM_ID == id)?1:0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft3p4039_lcm_drv = +{ + .name = "tft3p4039", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/alcatel_ot_918d_jrd73_gb/lcm/zte6516/zte6516.c b/alcatel_ot_918d_jrd73_gb/lcm/zte6516/zte6516.c new file mode 100644 index 0000000..d5ef25a --- /dev/null +++ b/alcatel_ot_918d_jrd73_gb/lcm/zte6516/zte6516.c @@ -0,0 +1,314 @@ + + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (240) +#define LCM_ID (0x57) +// --------------------------------------------------------------------------- +// Local Variables: +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (10) +#define POWER_ON_SEQ_DELAY (200) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0x00FF & (lcm_util.read_data() >> 1); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd((regIndex & 0x00FF) << 1); + send_data_cmd((regData & 0x00FF) << 1); +} + + +static void init_lcm_registers(void) +{ + + + //=======wenbo add============== + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x0072, 0x00F6); + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x00F2, 0x0000); + set_lcm_register(0x00E4, 0x0000); + set_lcm_register(0x00E5, 0x001C); + set_lcm_register(0x00E6, 0x0000); + set_lcm_register(0x00E7, 0x001C); + set_lcm_register(0x00EE, 0x0042); + set_lcm_register(0x00EF, 0x00DB); + set_lcm_register(0x002E, 0x0098); + set_lcm_register(0x0040, 0x0000); + set_lcm_register(0x0041, 0x002E); + set_lcm_register(0x0042, 0x002D); + set_lcm_register(0x0043, 0x003F); + set_lcm_register(0x0044, 0x003F); + set_lcm_register(0x0045, 0x003F); + set_lcm_register(0x0046, 0x002C); + set_lcm_register(0x0047, 0x007F); + set_lcm_register(0x0048, 0x0007); + set_lcm_register(0x0049, 0x0005); + set_lcm_register(0x004A, 0x0008); + set_lcm_register(0x004B, 0x0013); + set_lcm_register(0x004C, 0x001E); + set_lcm_register(0x0050, 0x0000); + set_lcm_register(0x0051, 0x0000); + set_lcm_register(0x0052, 0x0000); + set_lcm_register(0x0053, 0x0012); + set_lcm_register(0x0054, 0x0011); + set_lcm_register(0x0055, 0x003F); + set_lcm_register(0x0056, 0x0000); + set_lcm_register(0x0057, 0x0053); + set_lcm_register(0x0058, 0x0001); + set_lcm_register(0x0059, 0x000C); + set_lcm_register(0x005A, 0x0017); + set_lcm_register(0x005B, 0x001A); + set_lcm_register(0x005C, 0x0018); + set_lcm_register(0x005D, 0x00C3); + set_lcm_register(0x0002, 0x0000); + set_lcm_register(0x0003, 0x0000); + set_lcm_register(0x0004, 0x0001); + set_lcm_register(0x0005, 0x003F); + set_lcm_register(0x0006, 0x0000); + set_lcm_register(0x0007, 0x0000); + set_lcm_register(0x0008, 0x0000); + set_lcm_register(0x0009, 0x00EF); // + set_lcm_register(0x0024, 0x0022); + set_lcm_register(0x0025, 0x0064); + set_lcm_register(0x0023, 0x0090); + set_lcm_register(0x001B, 0x000E); + set_lcm_register(0x001D, 0x0011); + set_lcm_register(0x0019, 0x0001); + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x0001, 0x0000); + set_lcm_register(0x001F, 0x0080); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x0090); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x00D4); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x0028, 0x0008); + MDELAY(40); + set_lcm_register(0x0028, 0x0038); + MDELAY(40); //DELAY 40MS + set_lcm_register(0x0028, 0x003C); + //wr_com(0x0016, 0x0020); //0020 + set_lcm_register(0x0017, 0x0006); //18bit + send_ctrl_cmd(0x0022 << 1); + //===========wenbo add end========= + + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; //LCM_DBI_CLOCK_FREQ_52M + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2;//1; //0 + params->dbi.parallel.write_hold = 1; ////3 33 + params->dbi.parallel.write_wait = 3; //3// + params->dbi.parallel.read_setup = 0; ////2 + params->dbi.parallel.read_latency = 10; ////19 + params->dbi.parallel.wait_period = 0; ////0 +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + + static void lcm_suspend(void) + { + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0004); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0000); + + set_lcm_register(0x001F, 0x0089); + + set_lcm_register(0x0019, 0x0000); + + + /* set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); + */ + } + + + +static void lcm_resume(void) + { + + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0019, 0x0001); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x001F, 0x0080); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x00D4); + + MDELAY(5); + + set_lcm_register(0x0028, 0x0008); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x003C); + + /* set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); + */ + } + + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) + { + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x0022 << 1); + } + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER zte6516_lcm_drv = +{ + .name = "zte6516", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqe/lcm/bm8578/bm8578.c b/baoxue_mytqe/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..d854dc2 --- /dev/null +++ b/baoxue_mytqe/lcm/bm8578/bm8578.c @@ -0,0 +1,339 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqe/lcm/dummy/dummy.c b/baoxue_mytqe/lcm/dummy/dummy.c new file mode 100644 index 0000000..b1b5673 --- /dev/null +++ b/baoxue_mytqe/lcm/dummy/dummy.c @@ -0,0 +1,180 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/baoxue_mytqe/lcm/hc_hx8352c/hc_hx8352c.c b/baoxue_mytqe/lcm/hc_hx8352c/hc_hx8352c.c new file mode 100644 index 0000000..37a1dc1 --- /dev/null +++ b/baoxue_mytqe/lcm/hc_hx8352c/hc_hx8352c.c @@ -0,0 +1,535 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) // (480) +#define FRAME_HEIGHT (400) // (800) + +#define READ_CC +#ifdef READ_CC +#define LCM_ID (0x0F) +#else +#define LCM_ID (0x9327) // 0x9327 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + send_ctrl_cmd(0x2C); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(HIGH_BYTE(data)); + send_data_cmd(LOW_BYTE(data)); + } + } +} + +static void init_lcm_registers(void) +{ + #if 1 // + + send_ctrl_cmd(0x11); + MDELAY(120); // SLPOUT + //MDELAY(100); + + send_ctrl_cmd(0xF3 ); //Set EQ + send_data_cmd(0x08); + send_data_cmd(0x20); + send_data_cmd(0x20); + send_data_cmd(0x08); + + send_ctrl_cmd(0xE7 ); + send_data_cmd(0x60); + + send_ctrl_cmd(0xD1 ); + send_data_cmd(0x00); + send_data_cmd(0x7B); + send_data_cmd(0x17); + + send_ctrl_cmd(0xD0 ); + send_data_cmd(0x07); + send_data_cmd(0x02); + send_data_cmd(0x85); + + send_ctrl_cmd(0x36 ); + send_data_cmd(0x48); + + send_ctrl_cmd(0xC1 ); + send_data_cmd(0x10); + send_data_cmd(0x1A); + send_data_cmd(0x02); + send_data_cmd(0x02); + + send_ctrl_cmd(0xC0 ); + send_data_cmd(0x05); // 0x00 + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x02); + + + send_ctrl_cmd(0xC4 ); + send_data_cmd(0x00); + + send_ctrl_cmd(0xC5 ); + send_data_cmd(0x0c); + + send_ctrl_cmd(0xD2 ); + send_data_cmd(0x01); + send_data_cmd(0x22); + + //GAMMA2.2 + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x57); + send_data_cmd(0x34); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x02); + send_data_cmd(0x34); + send_data_cmd(0x02); + send_data_cmd(0x77); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x0F); + send_data_cmd(0x08); + send_data_cmd(0x80); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x55); + + send_ctrl_cmd(0x2A); // set cloumn adrdress + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xEF); + + send_ctrl_cmd(0x2B); // set page adrdress + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x8F); + + send_ctrl_cmd(0x29); // display on + MDELAY(120); + //send_ctrl_cmd(0x2C); + #endif +} + + + + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_8BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_8_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + +/* +ASSERT(id >= LCD_IF_PARALLEL_0 && id <= LCD_IF_PARALLEL_2); + ASSERT(writeSetup <= 15U); + ASSERT(writeHold <= 4U); + ASSERT(writeWait <= 64U); + ASSERT(readSetup <= 15U); + ASSERT(readLatency <= 64U); + ASSERT(waitPeriod <= 1023U); +*/ + params->dbi.parallel.write_setup = 1; // 15; + params->dbi.parallel.write_hold = 2; //4; + params->dbi.parallel.write_wait = 3; //64; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 10; + params->dbi.parallel.wait_period = 5; +} + +static void lcm_init(void) +{ + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + #ifdef READ_CC + lcd_id = get_lcd_id_n(0xCC, 2); + #else + lcd_id = get_lcd_id_n(0xEF, 4); + lcd_id = (lcd_id << 8) | (get_lcd_id_n(0xEF, 5) & 0xff); + #endif + LCD_PRINT("[HC_HX8352C]lcm_init: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); // 400 + + #ifdef READ_CC + lcd_id = get_lcd_id_n(0xCC, 2); + #else + lcd_id = get_lcd_id_n(0xEF, 4); + lcd_id = (lcd_id << 8) | (get_lcd_id_n(0xEF, 5) & 0xff); + #endif + + LCD_PRINT("[HC_HX8352C]lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + id = (id << 8) | (read_data_cmd() & 0xFF); + + LCD_PRINT("[HC_HX8352C]get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT("[HC_HX8352C]get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) // (480) +#define FRAME_HEIGHT (400) // (800) +#define LCM_ID (0xB509) //(0xb509) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd >> 8); + lcm_util.send_cmd(cmd & 0xff); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data >> 8); + lcm_util.send_data(data & 0xff); +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + set_lcm_register(0x0210, x0, 0); + set_lcm_register(0x0211, x1, 0); + set_lcm_register(0x0212, y0, 0); + set_lcm_register(0x0213, y1, 0); + + set_lcm_register(0x0200, x0, 0); + set_lcm_register(0x0201, y0, 0); + + send_ctrl_cmd(0x0202); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + } + } +} +//unsigned int vddhh = 0x00; +static void init_lcm_registers(void) +{ + // ht_r61509 + #if 1 + // uses XXD's codes on 2012/08/06 + // Mr. Wan modifies codes on 2012/08/16 + set_lcm_register(0x0000, 0x0000, 0); + set_lcm_register(0x0000, 0x0000, 10); + + set_lcm_register(0x0000, 0x0000, 0); + set_lcm_register(0x0000, 0x0000, 0); + set_lcm_register(0x0000, 0x0000, 0); + set_lcm_register(0x0000, 0x0000, 10); + + set_lcm_register(0x0400, 0xE200, 0); // 0x6200 + set_lcm_register(0x0008, 0x0808, 0); + + set_lcm_register(0x0300, 0x0803, 0);//gamma + set_lcm_register(0x0301, 0x4714, 0); + set_lcm_register(0x0302, 0x0703, 0); + set_lcm_register(0x0303, 0x0D0A, 0); + + set_lcm_register(0x0304, 0x3233, 0); + + set_lcm_register(0x0305, 0x0A0D, 0); + set_lcm_register(0x0306, 0x4307, 0); + set_lcm_register(0x0307, 0x1407, 0); + set_lcm_register(0x0308, 0x0308, 0); + + set_lcm_register(0x0309, 0x3332, 0); + + set_lcm_register(0x0010, 0x0010, 0); + set_lcm_register(0x0011, 0x0101, 0); + set_lcm_register(0x0012, 0x0303, 0); + set_lcm_register(0x0013, 0x0001, 0); + + set_lcm_register(0x0100, 0x0330, 0);//BT,AP + set_lcm_register(0x0101, 0x0247, 0);//DC0,DC1,VC + set_lcm_register(0x0103, 0x1000, 0);//VDV 0x1300 + + set_lcm_register(0x0280, 0x5400, 0);//VCM 0x6200 + //vddhh += 2; + set_lcm_register(0x0102, 0xF9B0, 100);//VRH,VCMR,PSON,PON + + set_lcm_register(0x0001, 0x0000, 0); // 0x0100 + set_lcm_register(0x0002, 0x0100, 0); + set_lcm_register(0x0003, 0x1030, 0); + set_lcm_register(0x0009, 0x0001, 0); + set_lcm_register(0x000C, 0x0000, 0); + set_lcm_register(0x0090, 0x8000, 0); + set_lcm_register(0x000F, 0x0000, 0); + + set_lcm_register(0x0210, 0x0000, 0); + set_lcm_register(0x0211, 0x00EF, 0); + set_lcm_register(0x0212, 0x0000, 0); + set_lcm_register(0x0213, 0x018F, 0);//432=1AF, 400=18F + set_lcm_register(0x0200, 0x0000, 0); + set_lcm_register(0x0201, 0x0000, 0); + + set_lcm_register(0x0500, 0x0000, 0); + set_lcm_register(0x0501, 0x0000, 0); + set_lcm_register(0x0502, 0x005F, 0); + set_lcm_register(0x0401, 0x0001, 0); + set_lcm_register(0x0404, 0x0000, 100); + + set_lcm_register(0x0007, 0x0100, 100);//BASEE + + send_ctrl_cmd(0x0202); + #else + // codes given by Hongtao Co. 20120608 + + set_lcm_register(0x0000, 0x0000, 0); + set_lcm_register(0x0000, 0x0000, 10); + //set_lcm_register(time, 0x10 ,ms, 0); + set_lcm_register(0x0000, 0x0000, 0); + set_lcm_register(0x0000, 0x0000, 0); + set_lcm_register(0x0000, 0x0000, 0); + set_lcm_register(0x0000, 0x0000, 10); + //set_lcm_register(time, 0x10 ,ms, 0); + set_lcm_register(0x0400, 0xE200, 0); // 0x6200 + set_lcm_register(0x0008, 0x0808, 0); + + set_lcm_register(0x0300, 0x0109, 0); + set_lcm_register(0x0301, 0x7E0A, 0); + set_lcm_register(0x0302, 0x0704, 0); + set_lcm_register(0x0303, 0x0911, 0); + set_lcm_register(0x0304, 0x2100, 0); + + set_lcm_register(0x0305, 0x1109, 0); + set_lcm_register(0x0306, 0x7407, 0); + set_lcm_register(0x0307, 0x0A0E, 0); + set_lcm_register(0x0308, 0x0901, 0); + set_lcm_register(0x0309, 0x0021, 0); + + set_lcm_register(0x0010, 0x0010, 0); + set_lcm_register(0x0011, 0x0202, 0); + set_lcm_register(0x0012, 0x0300, 0); + set_lcm_register(0x0013, 0x0007, 10); + + set_lcm_register(0x0100, 0x0000, 0);//BT, AP + set_lcm_register(0x0101, 0x0007, 0);//DC0, DC1, VC + set_lcm_register(0x0102, 0x0000, 0); + set_lcm_register(0x0103, 0x0000, 0);//VDV + set_lcm_register(0x0280, 0x0000, 100);//VCM + //set_lcm_register(0x0102, 0x0000, 100);//VR, VCMR, PSON, PON + + + set_lcm_register(0x0100, 0x0330, 0);//BT, AP + set_lcm_register(0x0101, 0x0247, 50);//DC0, DC1, VC + set_lcm_register(0x0102, 0xD1B0, 50);//VR, VCMR, PSON, PON + set_lcm_register(0x0103, 0x1A00, 0);//VDV + set_lcm_register(0x0280, 0x6E00, 100);//VCM + + //set_lcm_register(time, 0x100 ,ms, 0); + + set_lcm_register(0x0001, 0x0000, 0); // 0x0100 + set_lcm_register(0x0002, 0x0100, 0); + set_lcm_register(0x0003, 0x1030, 0); + set_lcm_register(0x0009, 0x0001, 0); + set_lcm_register(0x000C, 0x0000, 0); + set_lcm_register(0x0090, 0x8000, 0); + set_lcm_register(0x000F, 0x0000, 0); + + set_lcm_register(0x0200, 0x0000, 0); + set_lcm_register(0x0210, 0x0000, 0); + set_lcm_register(0x0211, 0x00EF, 0); + set_lcm_register(0x0212, 0x0000, 0); + set_lcm_register(0x0213, 0x018F, 0); + set_lcm_register(0x0500, 0x0000, 0); + set_lcm_register(0x0501, 0x0000, 0); + set_lcm_register(0x0502, 0x005F, 0); + set_lcm_register(0x0401, 0x0001, 0); + set_lcm_register(0x0404, 0x0000, 50); + + set_lcm_register(0x0007, 0x0100, 110); + + set_lcm_register(0x0200, 0x0000, 0); + set_lcm_register(0x0201, 0x0000, 0); + + send_ctrl_cmd(0x0202); + #endif +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_8BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_8_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + +/* +ASSERT(id >= LCD_IF_PARALLEL_0 && id <= LCD_IF_PARALLEL_2); + ASSERT(writeSetup <= 15U); + ASSERT(writeHold <= 4U); + ASSERT(writeWait <= 64U); + ASSERT(readSetup <= 15U); + ASSERT(readLatency <= 64U); + ASSERT(waitPeriod <= 1023U); +*/ + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 3; // 2; + params->dbi.parallel.read_setup = 3; // 1; + params->dbi.parallel.read_latency = 10; + params->dbi.parallel.wait_period = 5; +} + +static void lcm_init(void) +{ + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + lcd_id = get_lcd_id_r(0x0000); + LCD_PRINT("[HT_R61509]lcm_init: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + set_lcm_register(0x0007, 0x0000, 100); + set_lcm_register(0x0102, 0xd180, 100); +} + + +static void lcm_resume(void) +{ + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(10); // 400 + + lcd_id = get_lcd_id_r(0x0000); + LCD_PRINT("[HT_R61509]lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x0210, x0, 0); + set_lcm_register(0x0211, x1, 0); + set_lcm_register(0x0212, y0, 0); + set_lcm_register(0x0213, y1, 0); + + set_lcm_register(0x0200, x0, 0); + set_lcm_register(0x0201, y0, 0); + + send_ctrl_cmd(0x0202); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT("[HT_R61509]get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT("[HT_R61509]get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< 0) + { + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + lcd_id = get_lcd_id_r(0x0000); + + LCD_PRINT("[HT_R61509]lcm_compare_id: lcd_id = 0x%x\n", lcd_id); + + if (LCM_ID == lcd_id) + return 1; + } + return (LCM_ID == lcd_id)?1:0; +} + +static unsigned int lcm_check_status(void) +{ + /* + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + */ + + return 1; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ht_r61509_lcm_drv = +{ + .name = "ht_r61509", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + + .compare_id = lcm_compare_id, + .set_backlight = lcm_setbacklight, + .set_pwm = lcm_setpwm, + .get_pwm = lcm_getpwm, + .check_status = lcm_check_status +}; diff --git a/baoxue_mytqe/lcm/hx8357B/hx8357b.c b/baoxue_mytqe/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..44a5389 --- /dev/null +++ b/baoxue_mytqe/lcm/hx8357B/hx8357b.c @@ -0,0 +1,353 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S + SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/baoxue_mytqe/lcm/hx8357B_lenovo/hx8357b_lenovo.c b/baoxue_mytqe/lcm/hx8357B_lenovo/hx8357b_lenovo.c new file mode 100644 index 0000000..61bf3d2 --- /dev/null +++ b/baoxue_mytqe/lcm/hx8357B_lenovo/hx8357b_lenovo.c @@ -0,0 +1,391 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S + SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ +#if BUILD_UBOOT +//#include +#else +#include +#endif +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +#define LENOVO_DVT /*LENOVO-XM jixj 2011.5.11 add ,if is a dvt machine£¬open£»if is a evt machine,close ;else LCD write error*/ + +unsigned int lcd_id; + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +unsigned int read_lcd_id() +{ + + unsigned int id,id1,id2,id3,id4,id5,id6; + send_ctrl_cmd(0xbf); + id1=read_data_cmd(); + id2=read_data_cmd(); + id3=read_data_cmd(); + id4=read_data_cmd()&0xff; + id5=read_data_cmd()&0xff; + id6=read_data_cmd(); + #if BUILD_UBOOT + printf("id4=%x,id5=%x\n",id4,id5); + #else + printk("id4=%x,id5=%x\n",id4,id5); + #endif + return (id4<<8|id5); + +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} +static void lcm_clear(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); //MPU Mode + + send_ctrl_cmd(0xC0); //Set PANEL +send_data_cmd(0x14); + send_data_cmd(0x3B); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x11); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); +send_data_cmd(0x15); +send_data_cmd(0x00); +send_data_cmd(0x22); +send_data_cmd(0x00); +send_data_cmd(0x08); +send_data_cmd(0x77); +send_data_cmd(0x26); +send_data_cmd(0x77); +send_data_cmd(0x22); +send_data_cmd(0x04); +send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x44); //DDVDH 0X44 + send_data_cmd(0x41); +send_data_cmd(0x06); //VREG1 + + send_ctrl_cmd(0xD1); //Set VCOM +send_data_cmd(0x42); //VCOMH +send_data_cmd(0x0F); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW +send_data_cmd(0x05); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xC5); + send_data_cmd(0x0A); + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x36); + send_data_cmd(0x41); + lcm_clear(0x00); + MDELAY(50); + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + //send_ctrl_cmd(0x21); + + + send_ctrl_cmd(0x29); + + +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + #ifdef LENOVO_DVT + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 10; + #else + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + #endif + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + lcd_id = read_lcd_id(); + #if BUILD_UBOOT + printf("lcd_id=%x\n",lcd_id); + #else + printk("lcd_id=%x\n",lcd_id); + #endif + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ +send_ctrl_cmd(0x28); // Display off +send_ctrl_cmd(0x10); // Enter Standby mode + MDELAY(120); +} + + +static void lcm_resume(void) +{ +send_ctrl_cmd(0x11); // Standby out +MDELAY(50); +send_ctrl_cmd(0x29); // Display on + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/baoxue_mytqe/lcm/hx8369/hx8369.c b/baoxue_mytqe/lcm/hx8369/hx8369.c new file mode 100644 index 0000000..3bf4cf2 --- /dev/null +++ b/baoxue_mytqe/lcm/hx8369/hx8369.c @@ -0,0 +1,601 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +#if defined(LCM_DSI_CMD_MODE) + { + data_array[0]=0x00043902; + data_array[1]=0x6983FFB9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00103902; + data_array[1]=0x032000B2; + data_array[2]=0xFF007003; + data_array[3]=0x00000000; + data_array[4]=0x01000303; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0]=0x00063902; + data_array[1]=0x700800B4; + data_array[2]=0x0000060E; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; + data_array[1] = 0x030100D5; + data_array[2] = 0x08020100; + data_array[3] = 0x00131180; + data_array[4] = 0x51064000; + data_array[5] = 0x71000007; + data_array[6] = 0x07046005; + data_array[7] = 0x0000060F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00143902; + data_array[1] = 0x340085B1; + data_array[2] = 0x0E0E0006; + data_array[3] = 0x1A1A2C24; + data_array[4] = 0xE6013A07; + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + // color format + { + // RGB565 + //data_array[0] = 0x053A1500; + // RGB666 + //data_array[0] = 0x063A1500; + // RGB888 + data_array[0] = 0x073A1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } + + data_array[0] = 0x02CC1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00033902; + data_array[1] = 0x006C6CB6 ; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + // ENABLE FMARK + //data_array[0] = 0x00023902; + //data_array[1] = 0x00000035 ; + //dsi_set_cmdq(&data_array, 2, 1); + //MDELAY(10); + + //data_array[0] = 0x00351500; + //dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(10); + + // SET GAMMA + data_array[0] = 0x00233902; + data_array[1] = 0x140C00E0; + data_array[2] = 0x293F3F3F; + data_array[3] = 0x0F0C0654; + data_array[4] = 0x15131513; + data_array[5] = 0x0C001F14; + data_array[6] = 0x3F3F3F14; + data_array[7] = 0x0C065429; + data_array[8] = 0x1315130F; + data_array[9] = 0x001F1415; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + + data_array[0] = 0x000E3902; //// SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA ; + data_array[2] = 0x10000A00 ; + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018 ; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + } +#else + { + data_array[0] = 0x00043902; // SET password + data_array[1] = 0x6983FFB9; // + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x00143902; //// SET Power + data_array[1] = 0x340085B1; // + data_array[2] = 0x0F0F0007; // + data_array[3] = 0x3F3F322A; // + data_array[4] = 0xE6013A01; // + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + data_array[0] = 0x00103902; //// SET Display 480x800 + data_array[1] = 0x032300B2; // + data_array[2] = 0xFF007003; // + data_array[3] = 0x00000000; // + data_array[4] = 0x01000303; // + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00063902; // SET Display + data_array[1] = 0x801800B4; + data_array[2] = 0x00000206; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x00033902; //// SET VCOM + data_array[1] = 0x004242B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; //// SET GIP + data_array[1] = 0x030400D5; + data_array[2] = 0x28050100; + data_array[3] = 0x00030170; + data_array[4] = 0x51064000; + data_array[5] = 0x41000007; + data_array[6] = 0x07075006; + data_array[7] = 0x0000040F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00233902; //// SET GAMMA + data_array[1] = 0x191300E0; // + data_array[2] = 0x283F3D38; // + data_array[3] = 0x0E0D0746; // + data_array[4] = 0x14121512; // + data_array[5] = 0x1300170F; + data_array[6] = 0x3F3D3819; + data_array[7] = 0x0D074628; + data_array[8] = 0x1215120E; + data_array[9] = 0x00170F14; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + +#if 0 + switch(g_ColorFormat) + { + case PACKED_RGB565: + data_array[0] = 0x553A1500; // SET pixel format + break; + + case LOOSED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + case PACKED_RGB888: + data_array[0] = 0x773A1500; // SET pixel format + break; + + case PACKED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + default: + //dbg_print("Format setting error \n\r"); + while(1); + break; + } + + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +#endif + data_array[0] = 0x000E3902; // SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA; // + data_array[2] = 0x10000A00; // + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } +#endif + //------------------------------------------------------------------------ + // LUT for HX8369 + //------------------------------------------------------------------------ + if (1)//(g_ColorFormat==0) + { + data_array[0] = 0x00C13902; //Set Color LUT 1 + data_array[1] = 0x1008002D; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000FF; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT 2 + data_array[1] = 0x08040000; + data_array[2] = 0x1814100C; + data_array[3] = 0x2824201C; + data_array[4] = 0x3834302C; + data_array[5] = 0x4844403C; + data_array[6] = 0x5854504C; + data_array[7] = 0x6864605C; + data_array[8] = 0x7874706C; + data_array[9] = 0x8884807C; + data_array[10] = 0x9894908C; + data_array[11] = 0xA8A4A09C; + data_array[12] = 0xB8B4B0AC; + data_array[13] = 0xC8C4C0BC; + data_array[14] = 0xD8D4D0CC; + data_array[15] = 0xE8E4E0DC; + dsi_set_cmdq(&data_array, 16, 1); + + MDELAY(10); + + data_array[0] = 0xF8F4F0EC; //Set Color LUT 3 + data_array[1] = 0x100800FC; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000F8; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT + data_array[1] = 0x00000000; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + } + +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // DBI + //params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // DPI + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.intermediat_buffer_num = 2; + + // DSI + params->dsi.DSI_WMEM_CONTI=0x3C; + params->dsi.DSI_RMEM_CONTI=0x3E; + //params->dsi.LANE_NUM=LCM_ONE_LANE; + params->dsi.LANE_NUM=LCM_TWO_LANE; + params->dsi.VC_NUM=0x0; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + params->dsi.HS_TRAIL=0x14; + params->dsi.HS_ZERO=0x14; + params->dsi.HS_PRPR=0x0A; + params->dsi.LPX=0x05; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x37; + params->dsi.TA_SURE=0x16; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x14; + params->dsi.CLK_ZERO=0x14; + params->dsi.LPX_WAIT=0x0A; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x0A; + + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + + //params->dsi.pll_div2=4; // div2=0~15: fout=fvo/(2*div2) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + //data_array[6]= 0x002c3901; + + dsi_set_cmdq(&data_array, 7, 0); + +} + +LCM_DRIVER hx8369_dsi_lcm_drv = +{ + .name = "hx8369_dsi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if defined(LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif + }; diff --git a/baoxue_mytqe/lcm/hx8369_hvga/hx8369_hvga.c b/baoxue_mytqe/lcm/hx8369_hvga/hx8369_hvga.c new file mode 100644 index 0000000..41f6993 --- /dev/null +++ b/baoxue_mytqe/lcm/hx8369_hvga/hx8369_hvga.c @@ -0,0 +1,644 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +/* // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING;*/ +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // AUO 3.17" + ILI9481 + + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); + send_data_cmd(0X0007); + send_data_cmd(0X0041); + send_data_cmd(0X001B); + + send_ctrl_cmd(0X00D1); + send_data_cmd(0X0000); + send_data_cmd(0X0016); // 0x001b + send_data_cmd(0X0012); + + send_ctrl_cmd(0X00D2); + send_data_cmd(0X0001); + send_data_cmd(0X0011); + + send_ctrl_cmd(0X00C0); + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X00F3); + send_data_cmd(0X0040); + send_data_cmd(0X000A); + send_ctrl_cmd(0X00F6); + send_data_cmd(0X0080); + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0080); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x29); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, +}; diff --git a/baoxue_mytqe/lcm/ili9481_dpi/ili9481_dpi.c b/baoxue_mytqe/lcm/ili9481_dpi/ili9481_dpi.c new file mode 100644 index 0000000..25d7711 --- /dev/null +++ b/baoxue_mytqe/lcm/ili9481_dpi/ili9481_dpi.c @@ -0,0 +1,476 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +#define dbg_print //printf + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +/* #define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) */ +/* #define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) */ +/* #define LSDA_GPIO_PIN (GPIO_DISP_LSA0_PIN) */ +/* #define LSA0_GPIO_PIN (GPIO_DISP_LSDA_PIN) */ + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define ICID_MODE 0 +#define SET_ICID_HIGH SET_GPIO_OUT(GPIO36, 1) +#define SET_ICID_LOW SET_GPIO_OUT(GPIO36, 0) + +#define GET_LSA0_IN mt_get_gpio_in(LSA0_GPIO_PIN) +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + int clk_num; + int clk_mask; + + UDELAY(100); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(100); + + clk_num = 9; + clk_mask = 0x100; + dbg_print("\n^"); + UDELAY(50); + for (i = 0; i < clk_num; ++ i) + { + SET_LSCK_LOW; + if (data & (clk_mask)) { // 0x80= (1 << (9-1)) + SET_LSDA_HIGH; + dbg_print("~1"); + } else { + SET_LSDA_LOW; + dbg_print("~0"); + } + UDELAY(100); + SET_LSCK_HIGH; + UDELAY(100); + data <<= 1; + } + dbg_print("\n"); + + SET_ICID_HIGH; + + SET_LSDA_HIGH; +} + +static __inline void spi_send_data_ICID(unsigned int data) +{ + unsigned int i; + + UDELAY(100); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(100); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_LOW; + if (data & (0x100)) { // 0x80= (1 << (9-1)) + SET_LSDA_HIGH; + dbg_print("~1"); + } else { + SET_LSDA_LOW; + dbg_print("~0"); + } + UDELAY(100); + SET_LSCK_HIGH; + UDELAY(100); + data <<= 1; + } + + SET_LSDA_HIGH; +} + +static __inline unsigned int spi_read_data(void) +{ + unsigned int i; + s32 inA0 = -1; + + UDELAY(100); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(100); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_LOW; + /* if (data & (0x100)) { // 0x80= (1 << (9-1)) */ + /* SET_LSDA_HIGH; */ + /* dbg_print("~1"); */ + /* } else { */ + /* SET_LSDA_LOW; */ + /* dbg_print("~0"); */ + /* } */ + UDELAY(100); + inA0 = GET_LSA0_IN; + //printf("`%d",inA0); + SET_LSCK_HIGH; + UDELAY(100); + } + //printf("\n"); + + + SET_LSDA_HIGH; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): cmd:0x%x \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__,cmd); + + unsigned int out = (cmd & 0xFF); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : data:0x%x \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__, data); + + unsigned int out = (data & 0xFF)| 0x100; + spi_send_data(out); +} + +#define LCD_WRITE_CMD(cmd) SET_LSCE_LOW;send_ctrl_cmd(cmd);SET_LSCE_HIGH +#define LCD_WRITE_DATA(data) SET_LSCE_LOW;send_data_cmd(data);SET_LSCE_HIGH + + +static void InitLCD_ILI9481_HVGA_CPT32() +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + //************* Start Initial Sequence **********// + MDELAY(100); // Delay 100 ms + LCD_WRITE_CMD(0x11); //Exit Sleep + MDELAY(20); + + LCD_WRITE_CMD(0xD0); //Power Setting + LCD_WRITE_DATA(0x07); + LCD_WRITE_DATA(0x42); + LCD_WRITE_DATA(0x18); + + LCD_WRITE_CMD(0xD1); //Vcom control + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x16);//07 + LCD_WRITE_DATA(0x0E); + + LCD_WRITE_CMD(0xD2); //Power setting for Normal mode + LCD_WRITE_DATA(0x01); + LCD_WRITE_DATA(0x02); + + LCD_WRITE_CMD(0xC0); //Panel Driver setting. + LCD_WRITE_DATA(0x10); + LCD_WRITE_DATA(0x3B); + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x02); + LCD_WRITE_DATA(0x11); + + LCD_WRITE_CMD(0xC5); //Frame rate and inversion control + LCD_WRITE_DATA(0x03); + + LCD_WRITE_CMD(0xC8); //Gamma setting + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x32); + LCD_WRITE_DATA(0x36); + LCD_WRITE_DATA(0x45); + LCD_WRITE_DATA(0x06); + LCD_WRITE_DATA(0x16); + LCD_WRITE_DATA(0x37); + LCD_WRITE_DATA(0x75); + LCD_WRITE_DATA(0x77); + LCD_WRITE_DATA(0x54); + LCD_WRITE_DATA(0x0C); + LCD_WRITE_DATA(0x00); + + LCD_WRITE_CMD(0x36); //Set address mode + //LCD_WRITE_DATA(0x0A); + LCD_WRITE_DATA(0x09); //Flip Vertically and Horizontally + + LCD_WRITE_CMD(0x3A);// set pixel format + LCD_WRITE_DATA(0x66); + + // LCD_WRITE_CMD(0x0C); //get pixel format + // LCD_WRITE_DATA(0x66); + + LCD_WRITE_CMD(0x2A); //set colum address + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x01); + LCD_WRITE_DATA(0x40); + + LCD_WRITE_CMD(0x2B);//set page address + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x01); + LCD_WRITE_DATA(0xE0); + MDELAY(120); + + LCD_WRITE_CMD(0xB4); //Display mode and Frame memory write mode setting. + LCD_WRITE_DATA(0x10); + + LCD_WRITE_CMD(0x29);//set display on + + LCD_WRITE_CMD(0x2C);// write memory start +} + + +static void config_gpio(void) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // CLK + params->dpi.mipi_pll_clk_ref = 1; + params->dpi.mipi_pll_clk_div1 = 8; + params->dpi.mipi_pll_clk_div2 = 3; + params->dpi.dpi_clk_div = 4; + params->dpi.dpi_clk_duty = 2; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + //params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + // Hsync Vsync + params->dpi.hsync_pulse_width = 1; + params->dpi.hsync_back_porch = 0; + params->dpi.hsync_front_porch = 0; + params->dpi.vsync_pulse_width = 1; + params->dpi.vsync_back_porch = 0; + params->dpi.vsync_front_porch = 0; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 1; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + config_gpio(); + + SET_RESET_PIN(0); + SET_LSCE_HIGH; + SET_LSCK_HIGH; + + MDELAY(300); + SET_RESET_PIN(1); + MDELAY(2); + + InitLCD_ILI9481_HVGA_CPT32(); +} + + +static void lcm_suspend(void) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + LCD_WRITE_CMD(0x10); +} + + +static void lcm_resume(void) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + LCD_WRITE_CMD(0x11); + LCD_WRITE_CMD(0x29); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + + +LCM_DRIVER ili9481_dpi_lcm_drv = + { + .name = "ili9481_dpi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/baoxue_mytqe/lcm/ili9803/ili9803.c b/baoxue_mytqe/lcm/ili9803/ili9803.c new file mode 100644 index 0000000..97783bd --- /dev/null +++ b/baoxue_mytqe/lcm/ili9803/ili9803.c @@ -0,0 +1,363 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // ILI9803 + send_ctrl_cmd(0X00FC); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0088); + send_data_cmd(0X0080); + send_data_cmd(0X000d); + send_data_cmd(0X0009); + send_data_cmd(0X0006); + + send_ctrl_cmd(0X00f0); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00f9); + send_data_cmd(0X0002); + + + send_ctrl_cmd(0X00B0); + send_data_cmd(0X0001); + + + send_ctrl_cmd(0X00B1); + send_data_cmd(0X0000); + send_data_cmd(0X0010); + send_data_cmd(0X0022); + + + send_ctrl_cmd(0X00B4); + send_data_cmd(0X0002); + + + send_ctrl_cmd(0X00B6); + send_data_cmd(0X0002); + send_data_cmd(0X00e2); + send_data_cmd(0X00FF); + send_data_cmd(0X0004); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0012); + send_data_cmd(0X000F); + send_data_cmd(0X000B); + + send_ctrl_cmd(0X00C2); + send_data_cmd(0X0022); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + send_data_cmd(0X0018); + + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + + + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0003); + send_data_cmd(0X00EF); + + send_ctrl_cmd(0X0036); + send_data_cmd(0X0008); + + + send_ctrl_cmd(0X00EA); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00E0); + send_data_cmd(0X0000); + send_data_cmd(0X0005); + send_data_cmd(0X0008); + send_data_cmd(0X000F); + send_data_cmd(0X000C); + send_data_cmd(0X000B); + send_data_cmd(0X000C); + send_data_cmd(0X000C); + send_data_cmd(0X0002); + send_data_cmd(0X0005); + send_data_cmd(0X001c); + send_data_cmd(0X0018); + send_data_cmd(0X0014); + send_data_cmd(0X001b); + send_data_cmd(0X0018); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00E1); + send_data_cmd(0X0000); + send_data_cmd(0X0018); + send_data_cmd(0X001b); + send_data_cmd(0X0014); + send_data_cmd(0X0018); + send_data_cmd(0X001B); + send_data_cmd(0X0005); + send_data_cmd(0X0002); + send_data_cmd(0X000c); + send_data_cmd(0X000c); + send_data_cmd(0X000b); + send_data_cmd(0X000d); + send_data_cmd(0X000f); + send_data_cmd(0X0009); + send_data_cmd(0X0005); + send_data_cmd(0X0000); + + + send_ctrl_cmd(0X003A); + send_data_cmd(0X0055); + + send_ctrl_cmd(0X0035); + send_data_cmd(0X0000); + + + send_ctrl_cmd(0X0044); + send_data_cmd(0X0000); +send_data_cmd(0X0030); + + send_ctrl_cmd(0X0011); + MDELAY(120); + +send_ctrl_cmd(0X0029); + MDELAY(20); +send_ctrl_cmd(0X002c); + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 3; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 5; + params->dbi.parallel.read_setup = 5; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9803_lcm_drv = +{ + .name = "ili9803", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, +}; diff --git a/baoxue_mytqe/lcm/inc/lcm_drv.h b/baoxue_mytqe/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..f40d2c5 --- /dev/null +++ b/baoxue_mytqe/lcm/inc/lcm_drv.h @@ -0,0 +1,479 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_latency; + unsigned int wait_period; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + LCM_LANE_NUM LANE_NUM; + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned int pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + unsigned int (*check_status)(void); +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/baoxue_mytqe/lcm/jx_rm68090/jx_rm68090.c b/baoxue_mytqe/lcm/jx_rm68090/jx_rm68090.c new file mode 100644 index 0000000..1642951 --- /dev/null +++ b/baoxue_mytqe/lcm/jx_rm68090/jx_rm68090.c @@ -0,0 +1,500 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) // (480) +#define FRAME_HEIGHT (320) // (800) +#define LCM_ID (0x6868) //(0x6809) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd >> 8); + lcm_util.send_cmd(cmd & 0xff); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data >> 8); + lcm_util.send_data(data & 0xff); +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + + if (0xffff != regData) + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + set_lcm_register(0x0050, x0, 0); + set_lcm_register(0x0051, x1, 0); + set_lcm_register(0x0052, y0, 0); + set_lcm_register(0x0053, y1, 0); + + set_lcm_register(0x0020, x0, 0); + set_lcm_register(0x0021, y0, 0); + + send_ctrl_cmd(0x0022); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + } + } +} + +static void init_lcm_registers(void) +{ + // JX_RM68090 + set_lcm_register(0x0001, 0x0000, 0);//0x0100, 0); // set SS and SM bit + set_lcm_register(0x0002, 0x0700, 0); // set 1 line inversion + + /*******תʾʱ set_lcm_register(0x0003, 0x1080)****/ + set_lcm_register(0x0003, 0x1030, 0); // set GRAM write direction and BGR=1. + set_lcm_register(0x0004, 0x0000, 0); // Resize register + set_lcm_register(0x0008, 0x0202, 0); //07, 0); // set the back porch and front porch + set_lcm_register(0x0009, 0x0000, 0); // set non-display area refresh cycle ISC[3:0] + set_lcm_register(0x000A, 0x0000, 0); // FMARK function + set_lcm_register(0x000C, 0x0000, 0); // RGB interface setting + set_lcm_register(0x000D, 0x0000, 0); // Frame marker Position + set_lcm_register(0x000F, 0x0000, 0); // RGB interface polarity + + //*************Power On sequence ****************// + set_lcm_register(0x0010, 0x0000, 0); + set_lcm_register(0x0011, 0x0001, 0); + set_lcm_register(0x0012, 0x0000, 0); + set_lcm_register(0x0013, 0x0000, 0); + set_lcm_register(0x0007, 0x0001, 200); + + set_lcm_register(0x0010, 0x1290, 0); + set_lcm_register(0x0011, 0x0221, 50); //27, 0); + + set_lcm_register(0x0012, 0x0082, 50); //11, 0); + + set_lcm_register(0x0013, 0x1f00, 0); //1d00, 0); //1200, 0); + set_lcm_register(0x0029, 0x0035, 0); //30, 0); + set_lcm_register(0x002B, 0x000d, 50); //0B, 0); + + set_lcm_register(0x0020, 0x0000, 0); + set_lcm_register(0x0021, 0x0000, 0); + // Gamma Paramters + set_lcm_register(0x0030, 0x0000, 0); //0004, 0); + set_lcm_register(0x0031, 0x0706, 0); //0707, 0); + set_lcm_register(0x0032, 0x0507, 0); //0103, 0); + set_lcm_register(0x0035, 0x0005, 0); //0301, 0); + set_lcm_register(0x0036, 0x0000, 0); //0806, 0); + set_lcm_register(0x0037, 0x0002, 0); //0106, 0); + set_lcm_register(0x0038, 0x0100, 0); //0000, 0); + set_lcm_register(0x0039, 0x0707, 0); //0307, 0); + set_lcm_register(0x003C, 0x0500, 0); //0202, 0); + set_lcm_register(0x003D, 0x0010, 0); //1d00, 0); + + //------------------ Set GRAM area ---------------// + set_lcm_register(0x0050, 0x0000, 0); // Horizontal GRAM Start Address + set_lcm_register(0x0051, 0x00EF, 0); // Horizontal GRAM End Address + set_lcm_register(0x0052, 0x0000, 0); // Vertical GRAM Start Address + set_lcm_register(0x0053, 0x013F, 0); // Vertical GRAM Start Address + set_lcm_register(0x0060, 0x2700, 0);//0xA700, 0); // Gate Scan Line + set_lcm_register(0x0061, 0x0001, 0); // NDL,VLE, REV + set_lcm_register(0x006A, 0x0000, 0); // set scrolling line + + //-------------- Partial Display Control ---------// + set_lcm_register(0x0080, 0x0000, 0); + set_lcm_register(0x0081, 0x0000, 0); + set_lcm_register(0x0082, 0x0000, 0); + set_lcm_register(0x0083, 0x0000, 0); + set_lcm_register(0x0084, 0x0000, 0); + set_lcm_register(0x0085, 0x0000, 0); + + //-------------- Panel Control -------------------// + set_lcm_register(0x0090, 0x0010, 0); + set_lcm_register(0x0092, 0x0000, 0); + set_lcm_register(0x0007, 0x0133, 0); // 262K color and display ON + + send_ctrl_cmd(0x0022); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_8BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_8_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + +/* +ASSERT(id >= LCD_IF_PARALLEL_0 && id <= LCD_IF_PARALLEL_2); + ASSERT(writeSetup <= 15U); + ASSERT(writeHold <= 4U); + ASSERT(writeWait <= 64U); + ASSERT(readSetup <= 15U); + ASSERT(readLatency <= 64U); + ASSERT(waitPeriod <= 1023U); +*/ + params->dbi.parallel.write_setup = 1; // 15; + params->dbi.parallel.write_hold = 2; //4; + params->dbi.parallel.write_wait = 3; //64; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 10; + params->dbi.parallel.wait_period = 5; +} + +static void lcm_init(void) +{ + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + lcd_id = get_lcd_id_r(0x0000); + LCD_PRINT("[JX_RM68090]lcm_init: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + set_lcm_register(0x0007, 0x0000, 100); + set_lcm_register(0x0102, 0xd180, 100); + + set_lcm_register(0x0007,0x0131, 10); // Set D1=0, D0=1 + set_lcm_register(0x0007,0x0130, 10); // Set D1=0, D0=0 + set_lcm_register(0x0007,0x0000, 0); // display OFF + + //************* Power OFF sequence **************// + set_lcm_register(0x0010,0x0080, 0); // SAP, BT[3:0], APE, AP, DSTB, SLP + set_lcm_register(0x0011,0x0000, 0); // DC1[2:0], DC0[2:0], VC[2:0] + set_lcm_register(0x0012,0x0000, 0); // VREG1OUT voltage + set_lcm_register(0x0013,0x0000, 50); // VDV[4:0] for VCOM amplitude + + set_lcm_register(0x0010,0x0082, 0); // SAP, BT[3:0], APE, AP, DSTB, SLP +} + + +static void lcm_resume(void) +{ + #if 1 + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(10); // 400 + + lcd_id = get_lcd_id_r(0x0000); + LCD_PRINT("[JX_RM68090]lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #else + //************* Power OFF sequence **************// + set_lcm_register(0x0010,0x0080, 0); // SAP, BT[3:0], APE, AP, DSTB, SLP + set_lcm_register(0x0011,0x0000, 0); // DC1[2:0], DC0[2:0], VC[2:0] + set_lcm_register(0x0012,0x0000, 0); // VREG1OUT voltage + set_lcm_register(0x0013,0x0000, 50); // VDV[4:0] for VCOM amplitude + + //*************Power On sequence ******************// + set_lcm_register(0x0010,0x0080, 50); // SAP, BT[3:0], AP, DSTB, SLP + set_lcm_register(0x0010,0x1290, 0); // SAP, BT[3:0], AP, DSTB, SLP, STB + set_lcm_register(0x0011,0x0221, 80); // DC1[2:0], DC0[2:0], VC[2:0] + set_lcm_register(0x0012,0x0082, 10); // External reference voltage =Vci; + set_lcm_register(0x0013,0x1f00, 0); // VDV[4:0] for VCOM amplitude + set_lcm_register(0x0029,0x0035, 50); // VCM[5:0] for VCOMH + set_lcm_register(0x0007,0x0133, 0); // 262K color and display ON + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x0050, x0, 0); + set_lcm_register(0x0051, x1, 0); + set_lcm_register(0x0052, y0, 0); + set_lcm_register(0x0053, y1, 0); + + set_lcm_register(0x0020, x0, 0); + set_lcm_register(0x0021, y0, 0); + + send_ctrl_cmd(0x0022); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT("[JX_RM68090]get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT("[JX_RM68090]get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/baoxue_mytqe/lcm/mt65xx_lcm_list.c b/baoxue_mytqe/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..2199c27 --- /dev/null +++ b/baoxue_mytqe/lcm/mt65xx_lcm_list.c @@ -0,0 +1,104 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER zte6516_lcm_drv; +extern LCM_DRIVER ili9803_lcm_drv; +extern LCM_DRIVER r61526_lcm_drv; +extern LCM_DRIVER ht_r61509_lcm_drv; +extern LCM_DRIVER hc_hx8352c_lcm_drv; +extern LCM_DRIVER jx_rm68090_lcm_drv; + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(ILI9803) + &ili9803_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(ZTE6516) + &zte6516_lcm_drv, +#endif +#if defined(HX8357B_LENOVO) + &hx8357b_lcm_drv, +#endif + +#if defined(R61526) + &r61526_lcm_drv, +#endif + +#if defined(HC_HX8352C) + &hc_hx8352c_lcm_drv, +#endif + +#if defined(HT_R61509) + &ht_r61509_lcm_drv, +#endif + +#if defined(JX_RM68090) + &jx_rm68090_lcm_drv, +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/baoxue_mytqe/lcm/mtk_cust.mk b/baoxue_mytqe/lcm/mtk_cust.mk new file mode 100755 index 0000000..ac0b85c --- /dev/null +++ b/baoxue_mytqe/lcm/mtk_cust.mk @@ -0,0 +1,38 @@ +# Copyright Statement: +# +# This software/firmware and related documentation ("MediaTek Software") are +# protected under relevant copyright laws. The information contained herein +# is confidential and proprietary to MediaTek Inc. and/or its licensors. +# Without the prior written permission of MediaTek inc. and/or its licensors, +# any reproduction, modification, use or disclosure of MediaTek Software, +# and information contained herein, in whole or in part, shall be strictly prohibited. + +# MediaTek Inc. (C) 2010. All rights reserved. +# +# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON +# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH +# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES +# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES +# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK +# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR +# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND +# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO +# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +# +# The following software/firmware and/or related documentation ("MediaTek Software") +# have been modified by MediaTek Inc. All revisions are subject to any receiver's +# applicable license agreements with MediaTek Inc. + + +# Used for UBOOT +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/baoxue_mytqe/lcm/nt35582/nt35582.c b/baoxue_mytqe/lcm/nt35582/nt35582.c new file mode 100644 index 0000000..2596afa --- /dev/null +++ b/baoxue_mytqe/lcm/nt35582/nt35582.c @@ -0,0 +1,418 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +*/ +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/baoxue_mytqe/lcm/nt35582_mcu/nt35582_mcu.c b/baoxue_mytqe/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..33d0380 --- /dev/null +++ b/baoxue_mytqe/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,463 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x05);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.wait_period = 1; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqe/lcm/r61526/r61526.c b/baoxue_mytqe/lcm/r61526/r61526.c new file mode 100644 index 0000000..cdeadcf --- /dev/null +++ b/baoxue_mytqe/lcm/r61526/r61526.c @@ -0,0 +1,791 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) // (480) +#define FRAME_HEIGHT (320) // (800) +#define LCM_ID (0x1526) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + send_ctrl_cmd(0x2C); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(HIGH_BYTE(data)); + send_data_cmd(LOW_BYTE(data)); + } + } +} + +static void init_lcm_registers(void) +{ + // r61526 + #if 1 // codes given by GuangTai Co. 20120528 + + send_ctrl_cmd(0xB0); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + MDELAY(5); + + send_ctrl_cmd(0xB3); + send_data_cmd(0x02); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xB4); + send_data_cmd(0x00); + + send_ctrl_cmd(0xC0); + send_data_cmd(0x33); + send_data_cmd(0x4F); + send_data_cmd(0x00); + send_data_cmd(0x10); + send_data_cmd(0xA2); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x00); + + send_ctrl_cmd(0xC1); + send_data_cmd(0x01); + send_data_cmd(0x02); + send_data_cmd(0x16); + send_data_cmd(0x04); + send_data_cmd(0x04); + + MDELAY(25); + + send_ctrl_cmd(0xC3); + send_data_cmd(0x01); + send_data_cmd(0x02); + send_data_cmd(0x16); + send_data_cmd(0x04); + send_data_cmd(0x04); + + MDELAY(25); + + send_ctrl_cmd(0xC4); + send_data_cmd(0x11); + send_data_cmd(0x01); + send_data_cmd(0x43); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8);//GAMMA + send_data_cmd(0x02); + send_data_cmd(0x08); + send_data_cmd(0x0B); + send_data_cmd(0x12); + send_data_cmd(0x10); + send_data_cmd(0x09); + send_data_cmd(0x04); + send_data_cmd(0x07); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x00); + + send_data_cmd(0x0E); + send_data_cmd(0x07); + send_data_cmd(0x04); + send_data_cmd(0x09); + send_data_cmd(0x10); + send_data_cmd(0x12); + send_data_cmd(0x0B); + send_data_cmd(0x08); + send_data_cmd(0x02); + send_data_cmd(0x14); + send_data_cmd(0x00); + + send_ctrl_cmd(0xC9);//GAMMA + send_data_cmd(0x02); + send_data_cmd(0x08); + send_data_cmd(0x0B); + send_data_cmd(0x12); + send_data_cmd(0x10); + send_data_cmd(0x09); + send_data_cmd(0x04); + send_data_cmd(0x07); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x00); + + send_data_cmd(0x0E); + send_data_cmd(0x07); + send_data_cmd(0x04); + send_data_cmd(0x09); + send_data_cmd(0x10); + send_data_cmd(0x12); + send_data_cmd(0x0B); + send_data_cmd(0x08); + send_data_cmd(0x02); + send_data_cmd(0x14); + send_data_cmd(0x00); + + send_ctrl_cmd(0xCA);//GAMMA + send_data_cmd(0x02); + send_data_cmd(0x08); + send_data_cmd(0x0B); + send_data_cmd(0x12); + send_data_cmd(0x10); + send_data_cmd(0x09); + send_data_cmd(0x04); + send_data_cmd(0x07); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x00); + + send_data_cmd(0x0E); + send_data_cmd(0x07); + send_data_cmd(0x04); + send_data_cmd(0x09); + send_data_cmd(0x10); + send_data_cmd(0x12); + send_data_cmd(0x0B); + send_data_cmd(0x08); + send_data_cmd(0x02); + send_data_cmd(0x14); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); + send_data_cmd(0x63);//BT + send_data_cmd(0x53); + send_data_cmd(0x82);//VC2 + send_data_cmd(0x37);//VRH + send_data_cmd(0x30);//DCT + send_data_cmd(0x00); + + send_ctrl_cmd(0xD1); + send_data_cmd(0x48); + send_data_cmd(0x5F); + send_data_cmd(0x10); + + send_ctrl_cmd(0xD2); + send_data_cmd(0x03); + send_data_cmd(0x24); + + send_ctrl_cmd(0xD4); + send_data_cmd(0x03); + send_data_cmd(0x24); + + send_ctrl_cmd(0xE2); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0x36); + send_data_cmd(0xC0); + + send_ctrl_cmd(0x3A); //16/18 bit + send_data_cmd(0x55);//66->18 bit, 55->16bit. + + send_ctrl_cmd(0x2A); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xEF); + + send_ctrl_cmd(0x2B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x11); + MDELAY(150); + + send_ctrl_cmd(0x29); + MDELAY(30); + + send_ctrl_cmd(0x2C); + #else + + send_ctrl_cmd(0x00B0); //Manufacturer Command Access Protect + send_data_cmd(0x003F); + send_data_cmd(0x003F); + MDELAY(5); + + send_ctrl_cmd(0x00B3); //Frame Memory Access and Interface Setting + send_data_cmd(0x0002); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + + send_ctrl_cmd(0x00B4);//Display Mode and Frame Memory Write Mode Setting + send_data_cmd(0x0000); + + send_ctrl_cmd(0x00C0); //Panel Driving Setting + send_data_cmd(0x0033); //0 0 1 REV, SM GS BGR SS + send_data_cmd(0x004F); //0 NL[6:0] + send_data_cmd(0x0000); //0 SCN[6:0] + send_data_cmd(0x0010); // + send_data_cmd(0x00A0); /// //1 0 1 0, 0 0 BLV PTV //0:LINE.1:FRAME + send_data_cmd(0x0000); //0 0 BLS NDL, PTDC PTS 0 0 + send_data_cmd(0x0001); //0 0 0 PTG,ISC[3:0] + send_data_cmd(0x0000); // + + send_ctrl_cmd(0x00C1); //Display Timing Setting for Normal / Partial Mode + send_data_cmd(0x0001); //0 0 0 0, 0 0 0 BC0 + send_data_cmd(0x0002); //0 0 0 0, 0 0 DIV0[1:0] + send_data_cmd(0x0018); //0 0 RTN0[5:0] //These bits set 1 line period//15-3F + send_data_cmd(0x0004); //BP0[7:0] + send_data_cmd(0x0004); //FP0[7:0] + MDELAY(25); + + send_ctrl_cmd(0x00C3); //Display Timing Setting for Idle Mode + send_data_cmd(0x0001); //0 0 0 0, 0 0 0 BC2 + send_data_cmd(0x0002); //0 0 0 0, 0 0 DIV2[1:0] + send_data_cmd(0x0018); //0 0 RTN2[5:0] + send_data_cmd(0x0004); //BP2[7:0] + send_data_cmd(0x0004); //FP2[7:0] + MDELAY(25); + + send_ctrl_cmd(0x00C4); //Source/VCOM/Gate Driving Timing Setting + send_data_cmd(0x0033); //0 SDT[2:0],0 NOW[2:0] //source:0-7,gate:0-7 + send_data_cmd(0x0003); //0 0 0 0, 0 MCP[2:0] //vcom:0-7 + send_data_cmd(0x0023); //VEQW[3:0],0 0 VEM[1:0] //VCOM equalize period:0-15 + send_data_cmd(0x0004); //0 0 0 0,SPCW[3:0] // + send_data_cmd(0x0000); //0 0 0 0 0 0 0 0 + + //Gamma setting start + send_ctrl_cmd(0x00C8);//Gamma + send_data_cmd(0x0007); + send_data_cmd(0x0009); + send_data_cmd(0x000A); + send_data_cmd(0x000C); + send_data_cmd(0x0018); + send_data_cmd(0x000D); + send_data_cmd(0x0005); + send_data_cmd(0x0004); + send_data_cmd(0x0007); + send_data_cmd(0x0003); + send_data_cmd(0x0000); + send_data_cmd(0x0003); + send_data_cmd(0x0007); + send_data_cmd(0x0004); + send_data_cmd(0x0005); + send_data_cmd(0x000D); + send_data_cmd(0x0018); + send_data_cmd(0x000C); + send_data_cmd(0x000A); + send_data_cmd(0x0009); + send_data_cmd(0x0007); + send_data_cmd(0x0000); + + + send_ctrl_cmd(0x00C9);//Gamma + send_data_cmd(0x0007); + send_data_cmd(0x0009); + send_data_cmd(0x000A); + send_data_cmd(0x000C); + send_data_cmd(0x0018); + send_data_cmd(0x000D); + send_data_cmd(0x0005); + send_data_cmd(0x0004); + send_data_cmd(0x0007); + send_data_cmd(0x0003); + send_data_cmd(0x0000); + send_data_cmd(0x0003); + send_data_cmd(0x0007); + send_data_cmd(0x0004); + send_data_cmd(0x0005); + send_data_cmd(0x000D); + send_data_cmd(0x0018); + send_data_cmd(0x000C); + send_data_cmd(0x000A); + send_data_cmd(0x0009); + send_data_cmd(0x0007); + send_data_cmd(0x0000); + + send_ctrl_cmd(0x00CA);//Gamma + send_data_cmd(0x0007); + send_data_cmd(0x0009); + send_data_cmd(0x000A); + send_data_cmd(0x000C); + send_data_cmd(0x0018); + send_data_cmd(0x000D); + send_data_cmd(0x0005); + send_data_cmd(0x0004); + send_data_cmd(0x0007); + send_data_cmd(0x0003); + send_data_cmd(0x0000); + send_data_cmd(0x0003); + send_data_cmd(0x0007); + send_data_cmd(0x0004); + send_data_cmd(0x0005); + send_data_cmd(0x000D); + send_data_cmd(0x0018); + send_data_cmd(0x000C); + send_data_cmd(0x000A); + send_data_cmd(0x0009); + send_data_cmd(0x0007); + //================================================= + //====Power setting start========================== + //================================================= + send_ctrl_cmd(0x00D0); //Power Setting (Common Setting) + send_data_cmd(0x0033); //0 BT[2:0],0 0 1 1 //DDVDH VCL VGH VGL + send_data_cmd(0x0053); //0 1 0 1, 0 0 1 1 + send_data_cmd(0x0085); /// //1 0 0 0, 0 VC2[2:0] //VCI2 + send_data_cmd(0x003D); //0 0 VRH[5:0] //VREG voltage + send_data_cmd(0x0030); //0 0 1 1, 0 DCT[2:0] + send_data_cmd(0x0000); //0 0 0 0, 0 0 0 0 + + send_ctrl_cmd(0x00D1); //VCOM Setting + send_data_cmd(0x003E); //0 VCM[6:0] //VCOMH voltage:00-7F + send_data_cmd(0x006A); //0 VDV[6:0] //VCOMa mplitude:00-7f + send_data_cmd(0x0010); //0 0 0 1, 0 0 0 0 + + send_ctrl_cmd(0x00D2); //Power Setting for Normal/Partial Mode + send_data_cmd(0x0001); + send_data_cmd(0x0024); + + send_ctrl_cmd(0x00D4);//Power Setting for Idle Mode + send_data_cmd(0x0001); + send_data_cmd(0x0024); + + send_ctrl_cmd(0x00E2); //NVM Load Control + send_data_cmd(0x003F); + //========================================= + //======Power setting End================== + //========================================= + send_ctrl_cmd(0x0034); //set_tear_on + //send_ctrl_cmd(0x0035); //set_tear_on + //send_data_cmd(0x0000); + + send_ctrl_cmd(0x0036); //set_address_mode + send_data_cmd(0x00C0); + + send_ctrl_cmd(0x003A);//set_pixel_format + send_data_cmd(0x0055); + + send_ctrl_cmd(0x002A); //set_column_address + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x00EF); + + send_ctrl_cmd(0x002B); //set_page_address + send_data_cmd(0x0000); + send_data_cmd(0x0000); + send_data_cmd(0x0001); + send_data_cmd(0x003F); + + send_ctrl_cmd(0x0011); //exit_sleep_mode + MDELAY(100); + send_ctrl_cmd(0x0029); //set_display_on + MDELAY(50); + send_ctrl_cmd(0x002C); //write_memory_start + //MDELAY(200); + #endif + + // test + //lcm_update_black(0, 0, 240, 320, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_8BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_8_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + +/* +ASSERT(id >= LCD_IF_PARALLEL_0 && id <= LCD_IF_PARALLEL_2); + ASSERT(writeSetup <= 15U); + ASSERT(writeHold <= 4U); + ASSERT(writeWait <= 64U); + ASSERT(readSetup <= 15U); + ASSERT(readLatency <= 64U); + ASSERT(waitPeriod <= 1023U); +*/ + params->dbi.parallel.write_setup = 1; // 15; + params->dbi.parallel.write_hold = 2; //4; + params->dbi.parallel.write_wait = 3; //64; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 10; + params->dbi.parallel.wait_period = 5; +} + +static void lcm_init(void) +{ + unsigned int lcd_id = 0; + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + send_ctrl_cmd(0x00b0); + send_data_cmd(0x003F); + send_data_cmd(0x003F); + MDELAY(5); + + lcd_id = get_lcd_id_n(0xBF, 4); + lcd_id = (lcd_id << 8) | (get_lcd_id_n(0xBF, 5) & 0xff); + LCD_PRINT("[HT_R61526]lcm_init: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(10); + + send_ctrl_cmd(0x00b0); + send_data_cmd(0x003F); + send_data_cmd(0x003F); + MDELAY(5); + + lcd_id = get_lcd_id_n(0xBF, 4); + lcd_id = (lcd_id << 8) | (get_lcd_id_n(0xBF, 5) & 0xff); + LCD_PRINT("[HT_R61526]lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); + +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + id = (id << 8) | (read_data_cmd() & 0xFF); + + LCD_PRINT("[HT_R61526]get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT("[HT_R61526]get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqe/lcm/spfd5461a/spfd5461a.c b/baoxue_mytqe/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..8b77cff --- /dev/null +++ b/baoxue_mytqe/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,420 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqe/lcm/ta7601/ta7601.c b/baoxue_mytqe/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..8bbdeb9 --- /dev/null +++ b/baoxue_mytqe/lcm/ta7601/ta7601.c @@ -0,0 +1,353 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/baoxue_mytqe/lcm/tft1p3037/tft1p3037.c b/baoxue_mytqe/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..1177e37 --- /dev/null +++ b/baoxue_mytqe/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,384 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqe/lcm/zte6516/zte6516.c b/baoxue_mytqe/lcm/zte6516/zte6516.c new file mode 100644 index 0000000..1e7e7dc --- /dev/null +++ b/baoxue_mytqe/lcm/zte6516/zte6516.c @@ -0,0 +1,382 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (240) +#define LCM_ID (0x57) +// --------------------------------------------------------------------------- +// Local Variables: +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (10) +#define POWER_ON_SEQ_DELAY (200) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0x00FF & (lcm_util.read_data() >> 1); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd((regIndex & 0x00FF) << 1); + send_data_cmd((regData & 0x00FF) << 1); +} + + +static void init_lcm_registers(void) +{ + + + //=======wenbo add============== + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x0072, 0x00F6); + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x00F2, 0x0000); + set_lcm_register(0x00E4, 0x0000); + set_lcm_register(0x00E5, 0x001C); + set_lcm_register(0x00E6, 0x0000); + set_lcm_register(0x00E7, 0x001C); + set_lcm_register(0x00EE, 0x0042); + set_lcm_register(0x00EF, 0x00DB); + set_lcm_register(0x002E, 0x0098); + set_lcm_register(0x0040, 0x0000); + set_lcm_register(0x0041, 0x002E); + set_lcm_register(0x0042, 0x002D); + set_lcm_register(0x0043, 0x003F); + set_lcm_register(0x0044, 0x003F); + set_lcm_register(0x0045, 0x003F); + set_lcm_register(0x0046, 0x002C); + set_lcm_register(0x0047, 0x007F); + set_lcm_register(0x0048, 0x0007); + set_lcm_register(0x0049, 0x0005); + set_lcm_register(0x004A, 0x0008); + set_lcm_register(0x004B, 0x0013); + set_lcm_register(0x004C, 0x001E); + set_lcm_register(0x0050, 0x0000); + set_lcm_register(0x0051, 0x0000); + set_lcm_register(0x0052, 0x0000); + set_lcm_register(0x0053, 0x0012); + set_lcm_register(0x0054, 0x0011); + set_lcm_register(0x0055, 0x003F); + set_lcm_register(0x0056, 0x0000); + set_lcm_register(0x0057, 0x0053); + set_lcm_register(0x0058, 0x0001); + set_lcm_register(0x0059, 0x000C); + set_lcm_register(0x005A, 0x0017); + set_lcm_register(0x005B, 0x001A); + set_lcm_register(0x005C, 0x0018); + set_lcm_register(0x005D, 0x00C3); + set_lcm_register(0x0002, 0x0000); + set_lcm_register(0x0003, 0x0000); + set_lcm_register(0x0004, 0x0001); + set_lcm_register(0x0005, 0x003F); + set_lcm_register(0x0006, 0x0000); + set_lcm_register(0x0007, 0x0000); + set_lcm_register(0x0008, 0x0000); + set_lcm_register(0x0009, 0x00EF); // + set_lcm_register(0x0024, 0x0022); + set_lcm_register(0x0025, 0x0064); + set_lcm_register(0x0023, 0x0090); + set_lcm_register(0x001B, 0x000E); + set_lcm_register(0x001D, 0x0011); + set_lcm_register(0x0019, 0x0001); + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x0001, 0x0000); + set_lcm_register(0x001F, 0x0080); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x0090); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x00D4); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x0028, 0x0008); + MDELAY(40); + set_lcm_register(0x0028, 0x0038); + MDELAY(40); //DELAY 40MS + set_lcm_register(0x0028, 0x003C); + //wr_com(0x0016, 0x0020); //0020 + set_lcm_register(0x0017, 0x0006); //18bit + send_ctrl_cmd(0x0022 << 1); + //===========wenbo add end========= + + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; //LCM_DBI_CLOCK_FREQ_52M + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2;//1; //0 + params->dbi.parallel.write_hold = 1; ////3 33 + params->dbi.parallel.write_wait = 3; //3// + params->dbi.parallel.read_setup = 0; ////2 + params->dbi.parallel.read_latency = 10; ////19 + params->dbi.parallel.wait_period = 0; ////0 +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + + static void lcm_suspend(void) + { + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0004); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0000); + + set_lcm_register(0x001F, 0x0089); + + set_lcm_register(0x0019, 0x0000); + + + /* set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); + */ + } + + + +static void lcm_resume(void) + { + + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0019, 0x0001); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x001F, 0x0080); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x00D4); + + MDELAY(5); + + set_lcm_register(0x0028, 0x0008); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x003C); + + /* set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); + */ + } + + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) + { + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x0022 << 1); + } + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER zte6516_lcm_drv = +{ + .name = "zte6516", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqt_yywi/lcm/bm8578/bm8578.c b/baoxue_mytqt_yywi/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..a723aa4 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/bm8578/bm8578.c @@ -0,0 +1,304 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqt_yywi/lcm/changxingda463_nt35510/changxingda463_nt35510.c b/baoxue_mytqt_yywi/lcm/changxingda463_nt35510/changxingda463_nt35510.c new file mode 100644 index 0000000..904cbfe --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/changxingda463_nt35510/changxingda463_nt35510.c @@ -0,0 +1,977 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +/* + * Notes: As for nt35512, register is 16 bits, but data is 8 bits. + * While writing, by non-nokia data format. + * While reading, by nokia data format. + * Author: chu, zewei + * Date: 2012/09/26 + */ + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +#define LCM_ID (0x5510) // reg 04h , the 2nd and 3rd parameters. +#define LCM_ID_REG (0xC500) // 0x0400 + +#define LCM_NAME "[CHANGXINGDA463_NT35510]" + +#define TE_CONTROL + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + + lcm_util.send_data(data); + +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + //id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +//static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + //if (uiDelay > 0) + // MDELAY(uiDelay); +} + +u8 vcom = 0xA3; +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + set_lcm_register(0x2A00, HIGH_BYTE(x0)); + set_lcm_register(0x2A01, LOW_BYTE(x0)); + set_lcm_register(0x2A02, HIGH_BYTE(x1)); + set_lcm_register(0x2A03, LOW_BYTE(x1)); + set_lcm_register(0x2B00, HIGH_BYTE(y0)); + set_lcm_register(0x2B01, LOW_BYTE(y0)); + set_lcm_register(0x2B02, HIGH_BYTE(y1)); + set_lcm_register(0x2B03, LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C00); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + send_data_cmd(data); + } + } + +} + +//static unsigned int vddhh = 0x69; + +static void init_lcm_registers(void) +{ + // LV2 Page 1 enable + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + + // AVDD Set AVDD 5.2V + set_lcm_register(0xB000,0x0D); + set_lcm_register(0xB001,0x0D); + set_lcm_register(0xB002,0x0D); + + // AVDD ratio + set_lcm_register(0xB600,0x34); + set_lcm_register(0xB601,0x34); + set_lcm_register(0xB602,0x34); + + // AVEE -5.2V + set_lcm_register(0xB100,0x0D); + set_lcm_register(0xB101,0x0D); + set_lcm_register(0xB102,0x0D); + + // AVEE ratio + set_lcm_register(0xB700,0x34); + set_lcm_register(0xB701,0x34); + set_lcm_register(0xB702,0x34); + + // VCL -2.5V + set_lcm_register(0xB200,0x00); + set_lcm_register(0xB201,0x00); + set_lcm_register(0xB202,0x00); + + // VCL ratio + set_lcm_register(0xB800,0x24); + set_lcm_register(0xB801,0x24); + set_lcm_register(0xB802,0x24); + + + // VGH 15V (Free pump) + set_lcm_register(0xBF00,0x01); + set_lcm_register(0xB300,0x0F); + set_lcm_register(0xB301,0x0F); + set_lcm_register(0xB302,0x0F); + + // VGH ratio + set_lcm_register(0xB900,0x34); + set_lcm_register(0xB901,0x34); + set_lcm_register(0xB902,0x34); + + // VGL_REG -10V + set_lcm_register(0xB500,0x08); + set_lcm_register(0xB501,0x08); + set_lcm_register(0xB502,0x08); + + set_lcm_register(0xC200,0x03); + + // VGLX ratio + set_lcm_register(0xBA00,0x24); + set_lcm_register(0xBA01,0x24); + set_lcm_register(0xBA02,0x24); + + // VGMP/VGSP 4.5V/0V + set_lcm_register(0xBC00,0x00); + set_lcm_register(0xBC01,0x78); + set_lcm_register(0xBC02,0x00); + + // VGMN/VGSN -4.5V/0V + set_lcm_register(0xBD00,0x00); + set_lcm_register(0xBD01,0x78); + set_lcm_register(0xBD02,0x00); + + // VCOM + set_lcm_register(0xBE00,0x00); + set_lcm_register(0xBE01,0x64); // 0x64 0xA3 +// vcom -= 2; + + // Gamma Setting + set_lcm_register(0xD100,0x00); + set_lcm_register(0xD101,0x33); + set_lcm_register(0xD102,0x00); + set_lcm_register(0xD103,0x34); + set_lcm_register(0xD104,0x00); + set_lcm_register(0xD105,0x3A); + set_lcm_register(0xD106,0x00); + set_lcm_register(0xD107,0x4A); + set_lcm_register(0xD108,0x00); + set_lcm_register(0xD109,0x5C); + set_lcm_register(0xD10A,0x00); + set_lcm_register(0xD10B,0x81); + set_lcm_register(0xD10C,0x00); + set_lcm_register(0xD10D,0xA6); + set_lcm_register(0xD10E,0x00); + set_lcm_register(0xD10F,0xE5); + set_lcm_register(0xD110,0x01); + set_lcm_register(0xD111,0x13); + set_lcm_register(0xD112,0x01); + set_lcm_register(0xD113,0x54); + set_lcm_register(0xD114,0x01); + set_lcm_register(0xD115,0x82); + set_lcm_register(0xD116,0x01); + set_lcm_register(0xD117,0xCA); + set_lcm_register(0xD118,0x02); + set_lcm_register(0xD119,0x00); + set_lcm_register(0xD11A,0x02); + set_lcm_register(0xD11B,0x01); + set_lcm_register(0xD11C,0x02); + set_lcm_register(0xD11D,0x34); + set_lcm_register(0xD11E,0x02); + set_lcm_register(0xD11F,0x67); + set_lcm_register(0xD120,0x02); + set_lcm_register(0xD121,0x84); + set_lcm_register(0xD122,0x02); + set_lcm_register(0xD123,0xA4); + set_lcm_register(0xD124,0x02); + set_lcm_register(0xD125,0xB7); + set_lcm_register(0xD126,0x02); + set_lcm_register(0xD127,0xCF); + set_lcm_register(0xD128,0x02); + set_lcm_register(0xD129,0xDE); + set_lcm_register(0xD12A,0x02); + set_lcm_register(0xD12B,0xF2); + set_lcm_register(0xD12C,0x02); + set_lcm_register(0xD12D,0xFE); + set_lcm_register(0xD12E,0x03); + set_lcm_register(0xD12F,0x10); + set_lcm_register(0xD130,0x03); + set_lcm_register(0xD131,0x33); + set_lcm_register(0xD132,0x03); + set_lcm_register(0xD133,0x6D); + + set_lcm_register(0xD200,0x00); + set_lcm_register(0xD201,0x33); + set_lcm_register(0xD202,0x00); + set_lcm_register(0xD203,0x34); + set_lcm_register(0xD204,0x00); + set_lcm_register(0xD205,0x3A); + set_lcm_register(0xD206,0x00); + set_lcm_register(0xD207,0x4A); + set_lcm_register(0xD208,0x00); + set_lcm_register(0xD209,0x5C); + set_lcm_register(0xD20A,0x00); + set_lcm_register(0xD20B,0x81); + set_lcm_register(0xD20C,0x00); + set_lcm_register(0xD20D,0xA6); + set_lcm_register(0xD20E,0x00); + set_lcm_register(0xD20F,0xE5); + set_lcm_register(0xD210,0x01); + set_lcm_register(0xD211,0x13); + set_lcm_register(0xD212,0x01); + set_lcm_register(0xD213,0x54); + set_lcm_register(0xD214,0x01); + set_lcm_register(0xD215,0x82); + set_lcm_register(0xD216,0x01); + set_lcm_register(0xD217,0xCA); + set_lcm_register(0xD218,0x02); + set_lcm_register(0xD219,0x00); + set_lcm_register(0xD21A,0x02); + set_lcm_register(0xD21B,0x01); + set_lcm_register(0xD21C,0x02); + set_lcm_register(0xD21D,0x34); + set_lcm_register(0xD21E,0x02); + set_lcm_register(0xD21F,0x67); + set_lcm_register(0xD220,0x02); + set_lcm_register(0xD221,0x84); + set_lcm_register(0xD222,0x02); + set_lcm_register(0xD223,0xA4); + set_lcm_register(0xD224,0x02); + set_lcm_register(0xD225,0xB7); + set_lcm_register(0xD226,0x02); + set_lcm_register(0xD227,0xCF); + set_lcm_register(0xD228,0x02); + set_lcm_register(0xD229,0xDE); + set_lcm_register(0xD22A,0x02); + set_lcm_register(0xD22B,0xF2); + set_lcm_register(0xD22C,0x02); + set_lcm_register(0xD22D,0xFE); + set_lcm_register(0xD22E,0x03); + set_lcm_register(0xD22F,0x10); + set_lcm_register(0xD230,0x03); + set_lcm_register(0xD231,0x33); + set_lcm_register(0xD232,0x03); + set_lcm_register(0xD233,0x6D); + + set_lcm_register(0xD300,0x00); + set_lcm_register(0xD301,0x33); + set_lcm_register(0xD302,0x00); + set_lcm_register(0xD303,0x34); + set_lcm_register(0xD304,0x00); + set_lcm_register(0xD305,0x3A); + set_lcm_register(0xD306,0x00); + set_lcm_register(0xD307,0x4A); + set_lcm_register(0xD308,0x00); + set_lcm_register(0xD309,0x5C); + set_lcm_register(0xD30A,0x00); + set_lcm_register(0xD30B,0x81); + set_lcm_register(0xD30C,0x00); + set_lcm_register(0xD30D,0xA6); + set_lcm_register(0xD30E,0x00); + set_lcm_register(0xD30F,0xE5); + set_lcm_register(0xD310,0x01); + set_lcm_register(0xD311,0x13); + set_lcm_register(0xD312,0x01); + set_lcm_register(0xD313,0x54); + set_lcm_register(0xD314,0x01); + set_lcm_register(0xD315,0x82); + set_lcm_register(0xD316,0x01); + set_lcm_register(0xD317,0xCA); + set_lcm_register(0xD318,0x02); + set_lcm_register(0xD319,0x00); + set_lcm_register(0xD31A,0x02); + set_lcm_register(0xD31B,0x01); + set_lcm_register(0xD31C,0x02); + set_lcm_register(0xD31D,0x34); + set_lcm_register(0xD31E,0x02); + set_lcm_register(0xD31F,0x67); + set_lcm_register(0xD320,0x02); + set_lcm_register(0xD321,0x84); + set_lcm_register(0xD322,0x02); + set_lcm_register(0xD323,0xA4); + set_lcm_register(0xD324,0x02); + set_lcm_register(0xD325,0xB7); + set_lcm_register(0xD326,0x02); + set_lcm_register(0xD327,0xCF); + set_lcm_register(0xD328,0x02); + set_lcm_register(0xD329,0xDE); + set_lcm_register(0xD32A,0x02); + set_lcm_register(0xD32B,0xF2); + set_lcm_register(0xD32C,0x02); + set_lcm_register(0xD32D,0xFE); + set_lcm_register(0xD32E,0x03); + set_lcm_register(0xD32F,0x10); + set_lcm_register(0xD330,0x03); + set_lcm_register(0xD331,0x33); + set_lcm_register(0xD332,0x03); + set_lcm_register(0xD333,0x6D); + + set_lcm_register(0xD400,0x00); + set_lcm_register(0xD401,0x33); + set_lcm_register(0xD402,0x00); + set_lcm_register(0xD403,0x34); + set_lcm_register(0xD404,0x00); + set_lcm_register(0xD405,0x3A); + set_lcm_register(0xD406,0x00); + set_lcm_register(0xD407,0x4A); + set_lcm_register(0xD408,0x00); + set_lcm_register(0xD409,0x5C); + set_lcm_register(0xD40A,0x00); + set_lcm_register(0xD40B,0x81); + set_lcm_register(0xD40C,0x00); + set_lcm_register(0xD40D,0xA6); + set_lcm_register(0xD40E,0x00); + set_lcm_register(0xD40F,0xE5); + set_lcm_register(0xD410,0x01); + set_lcm_register(0xD411,0x13); + set_lcm_register(0xD412,0x01); + set_lcm_register(0xD413,0x54); + set_lcm_register(0xD414,0x01); + set_lcm_register(0xD415,0x82); + set_lcm_register(0xD416,0x01); + set_lcm_register(0xD417,0xCA); + set_lcm_register(0xD418,0x02); + set_lcm_register(0xD419,0x00); + set_lcm_register(0xD41A,0x02); + set_lcm_register(0xD41B,0x01); + set_lcm_register(0xD41C,0x02); + set_lcm_register(0xD41D,0x34); + set_lcm_register(0xD41E,0x02); + set_lcm_register(0xD41F,0x67); + set_lcm_register(0xD420,0x02); + set_lcm_register(0xD421,0x84); + set_lcm_register(0xD422,0x02); + set_lcm_register(0xD423,0xA4); + set_lcm_register(0xD424,0x02); + set_lcm_register(0xD425,0xB7); + set_lcm_register(0xD426,0x02); + set_lcm_register(0xD427,0xCF); + set_lcm_register(0xD428,0x02); + set_lcm_register(0xD429,0xDE); + set_lcm_register(0xD42A,0x02); + set_lcm_register(0xD42B,0xF2); + set_lcm_register(0xD42C,0x02); + set_lcm_register(0xD42D,0xFE); + set_lcm_register(0xD42E,0x03); + set_lcm_register(0xD42F,0x10); + set_lcm_register(0xD430,0x03); + set_lcm_register(0xD431,0x33); + set_lcm_register(0xD432,0x03); + set_lcm_register(0xD433,0x6D); + + set_lcm_register(0xD500,0x00); + set_lcm_register(0xD501,0x33); + set_lcm_register(0xD502,0x00); + set_lcm_register(0xD503,0x34); + set_lcm_register(0xD504,0x00); + set_lcm_register(0xD505,0x3A); + set_lcm_register(0xD506,0x00); + set_lcm_register(0xD507,0x4A); + set_lcm_register(0xD508,0x00); + set_lcm_register(0xD509,0x5C); + set_lcm_register(0xD50A,0x00); + set_lcm_register(0xD50B,0x81); + set_lcm_register(0xD50C,0x00); + set_lcm_register(0xD50D,0xA6); + set_lcm_register(0xD50E,0x00); + set_lcm_register(0xD50F,0xE5); + set_lcm_register(0xD510,0x01); + set_lcm_register(0xD511,0x13); + set_lcm_register(0xD512,0x01); + set_lcm_register(0xD513,0x54); + set_lcm_register(0xD514,0x01); + set_lcm_register(0xD515,0x82); + set_lcm_register(0xD516,0x01); + set_lcm_register(0xD517,0xCA); + set_lcm_register(0xD518,0x02); + set_lcm_register(0xD519,0x00); + set_lcm_register(0xD51A,0x02); + set_lcm_register(0xD51B,0x01); + set_lcm_register(0xD51C,0x02); + set_lcm_register(0xD51D,0x34); + set_lcm_register(0xD51E,0x02); + set_lcm_register(0xD51F,0x67); + set_lcm_register(0xD520,0x02); + set_lcm_register(0xD521,0x84); + set_lcm_register(0xD522,0x02); + set_lcm_register(0xD523,0xA4); + set_lcm_register(0xD524,0x02); + set_lcm_register(0xD525,0xB7); + set_lcm_register(0xD526,0x02); + set_lcm_register(0xD527,0xCF); + set_lcm_register(0xD528,0x02); + set_lcm_register(0xD529,0xDE); + set_lcm_register(0xD52A,0x02); + set_lcm_register(0xD52B,0xF2); + set_lcm_register(0xD52C,0x02); + set_lcm_register(0xD52D,0xFE); + set_lcm_register(0xD52E,0x03); + set_lcm_register(0xD52F,0x10); + set_lcm_register(0xD530,0x03); + set_lcm_register(0xD531,0x33); + set_lcm_register(0xD532,0x03); + set_lcm_register(0xD533,0x6D); + + set_lcm_register(0xD600,0x00); + set_lcm_register(0xD601,0x33); + set_lcm_register(0xD602,0x00); + set_lcm_register(0xD603,0x34); + set_lcm_register(0xD604,0x00); + set_lcm_register(0xD605,0x3A); + set_lcm_register(0xD606,0x00); + set_lcm_register(0xD607,0x4A); + set_lcm_register(0xD608,0x00); + set_lcm_register(0xD609,0x5C); + set_lcm_register(0xD60A,0x00); + set_lcm_register(0xD60B,0x81); + set_lcm_register(0xD60C,0x00); + set_lcm_register(0xD60D,0xA6); + set_lcm_register(0xD60E,0x00); + set_lcm_register(0xD60F,0xE5); + set_lcm_register(0xD610,0x01); + set_lcm_register(0xD611,0x13); + set_lcm_register(0xD612,0x01); + set_lcm_register(0xD613,0x54); + set_lcm_register(0xD614,0x01); + set_lcm_register(0xD615,0x82); + set_lcm_register(0xD616,0x01); + set_lcm_register(0xD617,0xCA); + set_lcm_register(0xD618,0x02); + set_lcm_register(0xD619,0x00); + set_lcm_register(0xD61A,0x02); + set_lcm_register(0xD61B,0x01); + set_lcm_register(0xD61C,0x02); + set_lcm_register(0xD61D,0x34); + set_lcm_register(0xD61E,0x02); + set_lcm_register(0xD61F,0x67); + set_lcm_register(0xD620,0x02); + set_lcm_register(0xD621,0x84); + set_lcm_register(0xD622,0x02); + set_lcm_register(0xD623,0xA4); + set_lcm_register(0xD624,0x02); + set_lcm_register(0xD625,0xB7); + set_lcm_register(0xD626,0x02); + set_lcm_register(0xD627,0xCF); + set_lcm_register(0xD628,0x02); + set_lcm_register(0xD629,0xDE); + set_lcm_register(0xD62A,0x02); + set_lcm_register(0xD62B,0xF2); + set_lcm_register(0xD62C,0x02); + set_lcm_register(0xD62D,0xFE); + set_lcm_register(0xD62E,0x03); + set_lcm_register(0xD62F,0x10); + set_lcm_register(0xD630,0x03); + set_lcm_register(0xD631,0x33); + set_lcm_register(0xD632,0x03); + set_lcm_register(0xD633,0x6D); + + + + // LV2 Page 0 enable + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x00); + + // Display control + set_lcm_register(0xB100, 0xCC); + set_lcm_register(0xB101, 0x00); + + //480x854 + send_ctrl_cmd(0xB500); send_data_cmd(0x6B); + + // Source hold time + set_lcm_register(0xB600,0x05); + + // Gate EQ control + set_lcm_register(0xB700,0x70); + set_lcm_register(0xB701,0x70); + + // Source EQ control (Mode 2) + set_lcm_register(0xB800,0x01); + set_lcm_register(0xB801,0x03); + set_lcm_register(0xB802,0x03); + set_lcm_register(0xB803,0x03); + + + // Inversion mode (2-dot) + set_lcm_register(0xBC00,0x02); // 0x02 + set_lcm_register(0xBC01,0x00); + set_lcm_register(0xBC02,0x00); + + // Timing control 4H w/ 4-delay + set_lcm_register(0xC900,0xD0); + set_lcm_register(0xC901,0x02); + set_lcm_register(0xC902,0x50); + set_lcm_register(0xC903,0x50); + set_lcm_register(0xC904,0x50); + +#ifdef TE_CONTROL + set_lcm_register(0x3500,0x00); +#endif + + set_lcm_register(0x3600,0x00); + set_lcm_register(0x3A00,0x55); //0x77 + + set_lcm_register(0x2A00,0x00); + set_lcm_register(0x2A01,0x00); + set_lcm_register(0x2A02,HIGH_BYTE(FRAME_WIDTH)); + set_lcm_register(0x2A03,LOW_BYTE(FRAME_WIDTH)); + set_lcm_register(0x2B00,0x00); + set_lcm_register(0x2B01,0x00); + set_lcm_register(0x2B02,HIGH_BYTE(FRAME_HEIGHT)); + set_lcm_register(0x2B03,LOW_BYTE(FRAME_HEIGHT)); + send_ctrl_cmd(0x2C00); + MDELAY(50); + send_ctrl_cmd(0x1100); + MDELAY(120); + //lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); + send_ctrl_cmd(0x2900); + MDELAY(50); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; + */ + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects bus composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects bus composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; // 2; + params->dbi.parallel.write_hold = 3; // 3; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; // 6; //6; + + params->dbi.parallel.read_setup = 2; // 2; // 4; // 3; + params->dbi.parallel.read_hold = 3; // 3; + params->dbi.parallel.read_latency = 18; // 18; + + params->dbi.parallel.wait_period = 1; // 2; // 2; + params->dbi.parallel.cs_high_width = 0; // 1; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + #ifdef TE_CONTROL + // enable tearing-free + /* + if (LCM_DBI_TE_MODE_DISABLED == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_Enable(FALSE)); + return; + } + + if (LCM_DBI_TE_MODE_VSYNC_ONLY == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY)); + } else if (LCM_DBI_TE_MODE_VSYNC_OR_HSYNC == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_OR_HSYNC)); + LCD_CHECK_RET(LCD_TE_ConfigVHSyncMode(dbi->te_hs_delay_cnt, + dbi->te_vs_width_cnt, + (LCD_TE_VS_WIDTH_CNT_DIV)dbi->te_vs_width_cnt_div)); + } else ASSERT(0); + + LCD_CHECK_RET(LCD_TE_SetEdgePolarity(dbi->te_edge_polarity)); + LCD_CHECK_RET(LCD_TE_Enable(TRUE)); + */ + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; //LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING; + + /* + * Notes: The body of the function LCD_TE_ConfigVHSyncMode() is void! + */ + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + #else + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + #endif +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(50); + send_ctrl_cmd(0x1000); + MDELAY(120); + +} + + +static void lcm_resume(void) +{ + #if 1 + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(100); // 400 + + set_lcm_register(0xF000,0x55); + set_lcm_register(0xF001,0xAA); + set_lcm_register(0xF002,0x52); + set_lcm_register(0xF003,0x08); + set_lcm_register(0xF004,0x01); + UDELAY(10); + + lcd_id = get_lcd_id_r(LCM_ID_REG) & 0xFF; + lcd_id = (lcd_id << 8) | (get_lcd_id_r(LCM_ID_REG + 1) & 0xFF); + + LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x2A00, HIGH_BYTE(x0)); + set_lcm_register(0x2A01, LOW_BYTE(x0)); + set_lcm_register(0x2A02, HIGH_BYTE(x1)); + set_lcm_register(0x2A03, LOW_BYTE(x1)); + set_lcm_register(0x2B00, HIGH_BYTE(y0)); + set_lcm_register(0x2B01, LOW_BYTE(y0)); + set_lcm_register(0x2B02, HIGH_BYTE(y1)); + set_lcm_register(0x2B03, LOW_BYTE(y1)); + + send_ctrl_cmd(0x2c00); + + //lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT(LCM_NAME"get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT(LCM_NAME"get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +/* + * Notes: As for nt35512, register is 16 bits, but data is 8 bits. + * While writing, by non-nokia data format. + * While reading, by nokia data format. + * Author: chu, zewei + * Date: 2012/09/26 + */ + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +#define LCM_ID (0x8120) // = [0xc501] << 8| [0xc500] +#define LCM_ID_REG (0xC500) // + +#define LCM_NAME "[DH402_RM68120]" + +#define TE_CONTROL + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + + lcm_util.send_data(data); + +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + //id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2C00); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + send_data_cmd(data); + } + } + +} + +//static unsigned int vddhh = 0x69; + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x01); + + send_ctrl_cmd(0xD100);send_data_cmd(0x00); + send_ctrl_cmd(0xD101);send_data_cmd(0x00); + send_ctrl_cmd(0xD102);send_data_cmd(0x11); + send_ctrl_cmd(0xD103);send_data_cmd(0x2F); + send_ctrl_cmd(0xD104);send_data_cmd(0x49); + send_ctrl_cmd(0xD105);send_data_cmd(0x00); + send_ctrl_cmd(0xD106);send_data_cmd(0x5E); + send_ctrl_cmd(0xD107);send_data_cmd(0x80); + send_ctrl_cmd(0xD108);send_data_cmd(0x9D); + send_ctrl_cmd(0xD109);send_data_cmd(0xCA); + send_ctrl_cmd(0xD10a);send_data_cmd(0x54); + send_ctrl_cmd(0xD10b);send_data_cmd(0xEE); + send_ctrl_cmd(0xD10c);send_data_cmd(0x0B); + send_ctrl_cmd(0xD10d);send_data_cmd(0x24); + send_ctrl_cmd(0xD10e);send_data_cmd(0x3B); + send_ctrl_cmd(0xD10f);send_data_cmd(0x55); + send_ctrl_cmd(0xD110);send_data_cmd(0x4F); + send_ctrl_cmd(0xD111);send_data_cmd(0x61); + send_ctrl_cmd(0xD112);send_data_cmd(0x72); + send_ctrl_cmd(0xD113);send_data_cmd(0x82); + send_ctrl_cmd(0xD114);send_data_cmd(0x55); + send_ctrl_cmd(0xD115);send_data_cmd(0x91); + send_ctrl_cmd(0xD116);send_data_cmd(0x9F); + send_ctrl_cmd(0xD117);send_data_cmd(0xAD); + send_ctrl_cmd(0xD118);send_data_cmd(0xBA); + send_ctrl_cmd(0xD119);send_data_cmd(0x55); + send_ctrl_cmd(0xD11a);send_data_cmd(0xC6); + send_ctrl_cmd(0xD11b);send_data_cmd(0xC8); + send_ctrl_cmd(0xD11c);send_data_cmd(0xD4); + send_ctrl_cmd(0xD11d);send_data_cmd(0xE0); + send_ctrl_cmd(0xD11e);send_data_cmd(0xA5); + send_ctrl_cmd(0xD11f);send_data_cmd(0xEB); + send_ctrl_cmd(0xD120);send_data_cmd(0xF6); + send_ctrl_cmd(0xD121);send_data_cmd(0x01); + send_ctrl_cmd(0xD122);send_data_cmd(0x0D); + send_ctrl_cmd(0xD123);send_data_cmd(0xAA); + send_ctrl_cmd(0xD124);send_data_cmd(0x19); + send_ctrl_cmd(0xD125);send_data_cmd(0x25); + send_ctrl_cmd(0xD126);send_data_cmd(0x31); + send_ctrl_cmd(0xD127);send_data_cmd(0x40); + send_ctrl_cmd(0xD128);send_data_cmd(0xAA); + send_ctrl_cmd(0xD129);send_data_cmd(0x51); + send_ctrl_cmd(0xD12a);send_data_cmd(0x66); + send_ctrl_cmd(0xD12b);send_data_cmd(0x85); + send_ctrl_cmd(0xD12c);send_data_cmd(0xBA); + send_ctrl_cmd(0xD12d);send_data_cmd(0xFE); + send_ctrl_cmd(0xD12e);send_data_cmd(0xE5); + send_ctrl_cmd(0xD12f);send_data_cmd(0x2E); + send_ctrl_cmd(0xD130);send_data_cmd(0x63); + send_ctrl_cmd(0xD131);send_data_cmd(0xA8); + send_ctrl_cmd(0xD132);send_data_cmd(0x0F); + send_ctrl_cmd(0xD133);send_data_cmd(0xED); + send_ctrl_cmd(0xD134);send_data_cmd(0xFF); + + send_ctrl_cmd(0xD200);send_data_cmd(0x00); + send_ctrl_cmd(0xD201);send_data_cmd(0x00); + send_ctrl_cmd(0xD202);send_data_cmd(0x11); + send_ctrl_cmd(0xD203);send_data_cmd(0x2F); + send_ctrl_cmd(0xD204);send_data_cmd(0x49); + send_ctrl_cmd(0xD205);send_data_cmd(0x00); + send_ctrl_cmd(0xD206);send_data_cmd(0x5E); + send_ctrl_cmd(0xD207);send_data_cmd(0x80); + send_ctrl_cmd(0xD208);send_data_cmd(0x9D); + send_ctrl_cmd(0xD209);send_data_cmd(0xCA); + send_ctrl_cmd(0xD20a);send_data_cmd(0x54); + send_ctrl_cmd(0xD20b);send_data_cmd(0xEE); + send_ctrl_cmd(0xD20c);send_data_cmd(0x0B); + send_ctrl_cmd(0xD20d);send_data_cmd(0x24); + send_ctrl_cmd(0xD20e);send_data_cmd(0x3B); + send_ctrl_cmd(0xD20f);send_data_cmd(0x55); + send_ctrl_cmd(0xD210);send_data_cmd(0x4F); + send_ctrl_cmd(0xD211);send_data_cmd(0x61); + send_ctrl_cmd(0xD212);send_data_cmd(0x72); + send_ctrl_cmd(0xD213);send_data_cmd(0x82); + send_ctrl_cmd(0xD214);send_data_cmd(0x55); + send_ctrl_cmd(0xD215);send_data_cmd(0x91); + send_ctrl_cmd(0xD216);send_data_cmd(0x9F); + send_ctrl_cmd(0xD217);send_data_cmd(0xAD); + send_ctrl_cmd(0xD218);send_data_cmd(0xBA); + send_ctrl_cmd(0xD219);send_data_cmd(0x55); + send_ctrl_cmd(0xD21a);send_data_cmd(0xC6); + send_ctrl_cmd(0xD21b);send_data_cmd(0xC8); + send_ctrl_cmd(0xD21c);send_data_cmd(0xD4); + send_ctrl_cmd(0xD21d);send_data_cmd(0xE0); + send_ctrl_cmd(0xD21e);send_data_cmd(0xA5); + send_ctrl_cmd(0xD21f);send_data_cmd(0xEB); + send_ctrl_cmd(0xD220);send_data_cmd(0xF6); + send_ctrl_cmd(0xD221);send_data_cmd(0x01); + send_ctrl_cmd(0xD222);send_data_cmd(0x0D); + send_ctrl_cmd(0xD223);send_data_cmd(0xAA); + send_ctrl_cmd(0xD224);send_data_cmd(0x19); + send_ctrl_cmd(0xD225);send_data_cmd(0x25); + send_ctrl_cmd(0xD226);send_data_cmd(0x31); + send_ctrl_cmd(0xD227);send_data_cmd(0x40); + send_ctrl_cmd(0xD228);send_data_cmd(0xAA); + send_ctrl_cmd(0xD229);send_data_cmd(0x51); + send_ctrl_cmd(0xD22a);send_data_cmd(0x66); + send_ctrl_cmd(0xD22b);send_data_cmd(0x85); + send_ctrl_cmd(0xD22c);send_data_cmd(0xBA); + send_ctrl_cmd(0xD22d);send_data_cmd(0xFE); + send_ctrl_cmd(0xD22e);send_data_cmd(0xE5); + send_ctrl_cmd(0xD22f);send_data_cmd(0x2E); + send_ctrl_cmd(0xD230);send_data_cmd(0x63); + send_ctrl_cmd(0xD231);send_data_cmd(0xA8); + send_ctrl_cmd(0xD232);send_data_cmd(0x0F); + send_ctrl_cmd(0xD233);send_data_cmd(0xED); + send_ctrl_cmd(0xD234);send_data_cmd(0xFF); + + send_ctrl_cmd(0xD300);send_data_cmd(0x00); + send_ctrl_cmd(0xD301);send_data_cmd(0x00); + send_ctrl_cmd(0xD302);send_data_cmd(0x11); + send_ctrl_cmd(0xD303);send_data_cmd(0x2F); + send_ctrl_cmd(0xD304);send_data_cmd(0x49); + send_ctrl_cmd(0xD305);send_data_cmd(0x00); + send_ctrl_cmd(0xD306);send_data_cmd(0x5E); + send_ctrl_cmd(0xD307);send_data_cmd(0x80); + send_ctrl_cmd(0xD308);send_data_cmd(0x9D); + send_ctrl_cmd(0xD309);send_data_cmd(0xCA); + send_ctrl_cmd(0xD30a);send_data_cmd(0x54); + send_ctrl_cmd(0xD30b);send_data_cmd(0xEE); + send_ctrl_cmd(0xD30c);send_data_cmd(0x0B); + send_ctrl_cmd(0xD30d);send_data_cmd(0x24); + send_ctrl_cmd(0xD30e);send_data_cmd(0x3B); + send_ctrl_cmd(0xD30f);send_data_cmd(0x55); + send_ctrl_cmd(0xD310);send_data_cmd(0x4F); + send_ctrl_cmd(0xD311);send_data_cmd(0x61); + send_ctrl_cmd(0xD312);send_data_cmd(0x72); + send_ctrl_cmd(0xD313);send_data_cmd(0x82); + send_ctrl_cmd(0xD314);send_data_cmd(0x55); + send_ctrl_cmd(0xD315);send_data_cmd(0x91); + send_ctrl_cmd(0xD316);send_data_cmd(0x9F); + send_ctrl_cmd(0xD317);send_data_cmd(0xAD); + send_ctrl_cmd(0xD318);send_data_cmd(0xBA); + send_ctrl_cmd(0xD319);send_data_cmd(0x55); + send_ctrl_cmd(0xD31a);send_data_cmd(0xC6); + send_ctrl_cmd(0xD31b);send_data_cmd(0xC8); + send_ctrl_cmd(0xD31c);send_data_cmd(0xD4); + send_ctrl_cmd(0xD31d);send_data_cmd(0xE0); + send_ctrl_cmd(0xD31e);send_data_cmd(0xA5); + send_ctrl_cmd(0xD31f);send_data_cmd(0xEB); + send_ctrl_cmd(0xD320);send_data_cmd(0xF6); + send_ctrl_cmd(0xD321);send_data_cmd(0x01); + send_ctrl_cmd(0xD322);send_data_cmd(0x0D); + send_ctrl_cmd(0xD323);send_data_cmd(0xAA); + send_ctrl_cmd(0xD324);send_data_cmd(0x19); + send_ctrl_cmd(0xD325);send_data_cmd(0x25); + send_ctrl_cmd(0xD326);send_data_cmd(0x31); + send_ctrl_cmd(0xD327);send_data_cmd(0x40); + send_ctrl_cmd(0xD328);send_data_cmd(0xAA); + send_ctrl_cmd(0xD329);send_data_cmd(0x51); + send_ctrl_cmd(0xD32a);send_data_cmd(0x66); + send_ctrl_cmd(0xD32b);send_data_cmd(0x85); + send_ctrl_cmd(0xD32c);send_data_cmd(0xBA); + send_ctrl_cmd(0xD32d);send_data_cmd(0xFE); + send_ctrl_cmd(0xD32e);send_data_cmd(0xE5); + send_ctrl_cmd(0xD32f);send_data_cmd(0x2E); + send_ctrl_cmd(0xD330);send_data_cmd(0x63); + send_ctrl_cmd(0xD331);send_data_cmd(0xA8); + send_ctrl_cmd(0xD332);send_data_cmd(0x0F); + send_ctrl_cmd(0xD333);send_data_cmd(0xED); + send_ctrl_cmd(0xD334);send_data_cmd(0xFF); + + send_ctrl_cmd(0xD400);send_data_cmd(0x00); + send_ctrl_cmd(0xD401);send_data_cmd(0x00); + send_ctrl_cmd(0xD402);send_data_cmd(0x11); + send_ctrl_cmd(0xD403);send_data_cmd(0x2F); + send_ctrl_cmd(0xD404);send_data_cmd(0x49); + send_ctrl_cmd(0xD405);send_data_cmd(0x00); + send_ctrl_cmd(0xD406);send_data_cmd(0x5E); + send_ctrl_cmd(0xD407);send_data_cmd(0x80); + send_ctrl_cmd(0xD408);send_data_cmd(0x9D); + send_ctrl_cmd(0xD409);send_data_cmd(0xCA); + send_ctrl_cmd(0xD40a);send_data_cmd(0x54); + send_ctrl_cmd(0xD40b);send_data_cmd(0xEE); + send_ctrl_cmd(0xD40c);send_data_cmd(0x0B); + send_ctrl_cmd(0xD40d);send_data_cmd(0x24); + send_ctrl_cmd(0xD40e);send_data_cmd(0x3B); + send_ctrl_cmd(0xD40f);send_data_cmd(0x55); + send_ctrl_cmd(0xD410);send_data_cmd(0x4F); + send_ctrl_cmd(0xD411);send_data_cmd(0x61); + send_ctrl_cmd(0xD412);send_data_cmd(0x72); + send_ctrl_cmd(0xD413);send_data_cmd(0x82); + send_ctrl_cmd(0xD414);send_data_cmd(0x55); + send_ctrl_cmd(0xD415);send_data_cmd(0x91); + send_ctrl_cmd(0xD416);send_data_cmd(0x9F); + send_ctrl_cmd(0xD417);send_data_cmd(0xAD); + send_ctrl_cmd(0xD418);send_data_cmd(0xBA); + send_ctrl_cmd(0xD419);send_data_cmd(0x55); + send_ctrl_cmd(0xD41a);send_data_cmd(0xC6); + send_ctrl_cmd(0xD41b);send_data_cmd(0xC8); + send_ctrl_cmd(0xD41c);send_data_cmd(0xD4); + send_ctrl_cmd(0xD41d);send_data_cmd(0xE0); + send_ctrl_cmd(0xD41e);send_data_cmd(0xA5); + send_ctrl_cmd(0xD41f);send_data_cmd(0xEB); + send_ctrl_cmd(0xD420);send_data_cmd(0xF6); + send_ctrl_cmd(0xD421);send_data_cmd(0x01); + send_ctrl_cmd(0xD422);send_data_cmd(0x0D); + send_ctrl_cmd(0xD423);send_data_cmd(0xAA); + send_ctrl_cmd(0xD424);send_data_cmd(0x19); + send_ctrl_cmd(0xD425);send_data_cmd(0x25); + send_ctrl_cmd(0xD426);send_data_cmd(0x31); + send_ctrl_cmd(0xD427);send_data_cmd(0x40); + send_ctrl_cmd(0xD428);send_data_cmd(0xAA); + send_ctrl_cmd(0xD429);send_data_cmd(0x51); + send_ctrl_cmd(0xD42a);send_data_cmd(0x66); + send_ctrl_cmd(0xD42b);send_data_cmd(0x85); + send_ctrl_cmd(0xD42c);send_data_cmd(0xBA); + send_ctrl_cmd(0xD42d);send_data_cmd(0xFE); + send_ctrl_cmd(0xD42e);send_data_cmd(0xE5); + send_ctrl_cmd(0xD42f);send_data_cmd(0x2E); + send_ctrl_cmd(0xD430);send_data_cmd(0x63); + send_ctrl_cmd(0xD431);send_data_cmd(0xA8); + send_ctrl_cmd(0xD432);send_data_cmd(0x0F); + send_ctrl_cmd(0xD433);send_data_cmd(0xED); + send_ctrl_cmd(0xD434);send_data_cmd(0xFF); + + send_ctrl_cmd(0xD500);send_data_cmd(0x00); + send_ctrl_cmd(0xD501);send_data_cmd(0x00); + send_ctrl_cmd(0xD502);send_data_cmd(0x11); + send_ctrl_cmd(0xD503);send_data_cmd(0x2F); + send_ctrl_cmd(0xD504);send_data_cmd(0x49); + send_ctrl_cmd(0xD505);send_data_cmd(0x00); + send_ctrl_cmd(0xD506);send_data_cmd(0x5E); + send_ctrl_cmd(0xD507);send_data_cmd(0x80); + send_ctrl_cmd(0xD508);send_data_cmd(0x9D); + send_ctrl_cmd(0xD509);send_data_cmd(0xCA); + send_ctrl_cmd(0xD50a);send_data_cmd(0x54); + send_ctrl_cmd(0xD50b);send_data_cmd(0xEE); + send_ctrl_cmd(0xD50c);send_data_cmd(0x0B); + send_ctrl_cmd(0xD50d);send_data_cmd(0x24); + send_ctrl_cmd(0xD50e);send_data_cmd(0x3B); + send_ctrl_cmd(0xD50f);send_data_cmd(0x55); + send_ctrl_cmd(0xD510);send_data_cmd(0x4F); + send_ctrl_cmd(0xD511);send_data_cmd(0x61); + send_ctrl_cmd(0xD512);send_data_cmd(0x72); + send_ctrl_cmd(0xD513);send_data_cmd(0x82); + send_ctrl_cmd(0xD514);send_data_cmd(0x55); + send_ctrl_cmd(0xD515);send_data_cmd(0x91); + send_ctrl_cmd(0xD516);send_data_cmd(0x9F); + send_ctrl_cmd(0xD517);send_data_cmd(0xAD); + send_ctrl_cmd(0xD518);send_data_cmd(0xBA); + send_ctrl_cmd(0xD519);send_data_cmd(0x55); + send_ctrl_cmd(0xD51a);send_data_cmd(0xC6); + send_ctrl_cmd(0xD51b);send_data_cmd(0xC8); + send_ctrl_cmd(0xD51c);send_data_cmd(0xD4); + send_ctrl_cmd(0xD51d);send_data_cmd(0xE0); + send_ctrl_cmd(0xD51e);send_data_cmd(0xA5); + send_ctrl_cmd(0xD51f);send_data_cmd(0xEB); + send_ctrl_cmd(0xD520);send_data_cmd(0xF6); + send_ctrl_cmd(0xD521);send_data_cmd(0x01); + send_ctrl_cmd(0xD522);send_data_cmd(0x0D); + send_ctrl_cmd(0xD523);send_data_cmd(0xAA); + send_ctrl_cmd(0xD524);send_data_cmd(0x19); + send_ctrl_cmd(0xD525);send_data_cmd(0x25); + send_ctrl_cmd(0xD526);send_data_cmd(0x31); + send_ctrl_cmd(0xD527);send_data_cmd(0x40); + send_ctrl_cmd(0xD528);send_data_cmd(0xAA); + send_ctrl_cmd(0xD529);send_data_cmd(0x51); + send_ctrl_cmd(0xD52a);send_data_cmd(0x66); + send_ctrl_cmd(0xD52b);send_data_cmd(0x85); + send_ctrl_cmd(0xD52c);send_data_cmd(0xBA); + send_ctrl_cmd(0xD52d);send_data_cmd(0xFE); + send_ctrl_cmd(0xD52e);send_data_cmd(0xE5); + send_ctrl_cmd(0xD52f);send_data_cmd(0x2E); + send_ctrl_cmd(0xD530);send_data_cmd(0x63); + send_ctrl_cmd(0xD531);send_data_cmd(0xA8); + send_ctrl_cmd(0xD532);send_data_cmd(0x0F); + send_ctrl_cmd(0xD533);send_data_cmd(0xED); + send_ctrl_cmd(0xD534);send_data_cmd(0xFF); + + send_ctrl_cmd(0xD600);send_data_cmd(0x00); + send_ctrl_cmd(0xD601);send_data_cmd(0x00); + send_ctrl_cmd(0xD602);send_data_cmd(0x11); + send_ctrl_cmd(0xD603);send_data_cmd(0x2F); + send_ctrl_cmd(0xD604);send_data_cmd(0x49); + send_ctrl_cmd(0xD605);send_data_cmd(0x00); + send_ctrl_cmd(0xD606);send_data_cmd(0x5E); + send_ctrl_cmd(0xD607);send_data_cmd(0x80); + send_ctrl_cmd(0xD608);send_data_cmd(0x9D); + send_ctrl_cmd(0xD609);send_data_cmd(0xCA); + send_ctrl_cmd(0xD60A);send_data_cmd(0x54); + send_ctrl_cmd(0xD60B);send_data_cmd(0xEE); + send_ctrl_cmd(0xD60C);send_data_cmd(0x0B); + send_ctrl_cmd(0xD60D);send_data_cmd(0x24); + send_ctrl_cmd(0xD60E);send_data_cmd(0x3B); + send_ctrl_cmd(0xD60F);send_data_cmd(0x55); + send_ctrl_cmd(0xD610);send_data_cmd(0x4F); + send_ctrl_cmd(0xD611);send_data_cmd(0x61); + send_ctrl_cmd(0xD612);send_data_cmd(0x72); + send_ctrl_cmd(0xD613);send_data_cmd(0x82); + send_ctrl_cmd(0xD614);send_data_cmd(0x55); + send_ctrl_cmd(0xD615);send_data_cmd(0x91); + send_ctrl_cmd(0xD616);send_data_cmd(0x9F); + send_ctrl_cmd(0xD617);send_data_cmd(0xAD); + send_ctrl_cmd(0xD618);send_data_cmd(0xBA); + send_ctrl_cmd(0xD619);send_data_cmd(0x55); + send_ctrl_cmd(0xD61a);send_data_cmd(0xC6); + send_ctrl_cmd(0xD61b);send_data_cmd(0xC8); + send_ctrl_cmd(0xD61c);send_data_cmd(0xD4); + send_ctrl_cmd(0xD61d);send_data_cmd(0xE0); + send_ctrl_cmd(0xD61e);send_data_cmd(0xA5); + send_ctrl_cmd(0xD61f);send_data_cmd(0xEB); + send_ctrl_cmd(0xD620);send_data_cmd(0xF6); + send_ctrl_cmd(0xD621);send_data_cmd(0x01); + send_ctrl_cmd(0xD622);send_data_cmd(0x0D); + send_ctrl_cmd(0xD623);send_data_cmd(0xAA); + send_ctrl_cmd(0xD624);send_data_cmd(0x19); + send_ctrl_cmd(0xD625);send_data_cmd(0x25); + send_ctrl_cmd(0xD626);send_data_cmd(0x31); + send_ctrl_cmd(0xD627);send_data_cmd(0x40); + send_ctrl_cmd(0xD628);send_data_cmd(0xAA); + send_ctrl_cmd(0xD629);send_data_cmd(0x51); + send_ctrl_cmd(0xD62a);send_data_cmd(0x66); + send_ctrl_cmd(0xD62b);send_data_cmd(0x85); + send_ctrl_cmd(0xD62c);send_data_cmd(0xBA); + send_ctrl_cmd(0xD62d);send_data_cmd(0xFE); + send_ctrl_cmd(0xD62e);send_data_cmd(0xE5); + send_ctrl_cmd(0xD62f);send_data_cmd(0x2E); + send_ctrl_cmd(0xD630);send_data_cmd(0x63); + send_ctrl_cmd(0xD631);send_data_cmd(0xA8); + send_ctrl_cmd(0xD632);send_data_cmd(0x0F); + send_ctrl_cmd(0xD633);send_data_cmd(0xED); + send_ctrl_cmd(0xD634);send_data_cmd(0xFF); + + send_ctrl_cmd(0xB000);send_data_cmd(0x0C); + send_ctrl_cmd(0xB001);send_data_cmd(0x0C); + send_ctrl_cmd(0xB002);send_data_cmd(0x0C); + + send_ctrl_cmd(0xB100);send_data_cmd(0x0C); + send_ctrl_cmd(0xB101);send_data_cmd(0x0C); + send_ctrl_cmd(0xB102);send_data_cmd(0x0C); + + send_ctrl_cmd(0xB600);send_data_cmd(0x34); + send_ctrl_cmd(0xB601);send_data_cmd(0x34); + send_ctrl_cmd(0xB602);send_data_cmd(0x34); + + send_ctrl_cmd(0xB700);send_data_cmd(0x24); + send_ctrl_cmd(0xB701);send_data_cmd(0x24); + send_ctrl_cmd(0xB702);send_data_cmd(0x24); + + send_ctrl_cmd(0xB800);send_data_cmd(0x24); + send_ctrl_cmd(0xB801);send_data_cmd(0x24); + send_ctrl_cmd(0xB802);send_data_cmd(0x24); + + send_ctrl_cmd(0xB900);send_data_cmd(0x34); + send_ctrl_cmd(0xB901);send_data_cmd(0x34); + send_ctrl_cmd(0xB902);send_data_cmd(0x34); + + send_ctrl_cmd(0xBA00);send_data_cmd(0x24); + send_ctrl_cmd(0xBA01);send_data_cmd(0x24); + send_ctrl_cmd(0xBA02);send_data_cmd(0x24); + + send_ctrl_cmd(0xBC00);send_data_cmd(0x00); + send_ctrl_cmd(0xBC01);send_data_cmd(0x80); + send_ctrl_cmd(0xBC02);send_data_cmd(0x20); + + send_ctrl_cmd(0xBD00);send_data_cmd(0x00); + send_ctrl_cmd(0xBD01);send_data_cmd(0x80); + send_ctrl_cmd(0xBD02);send_data_cmd(0x20); + + send_ctrl_cmd(0xBE00);send_data_cmd(0x00); + send_ctrl_cmd(0xBE01);send_data_cmd(0x60); + + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x00); + + send_ctrl_cmd(0xB400);send_data_cmd(0x10); + + send_ctrl_cmd(0xB600);send_data_cmd(0x02); + + send_ctrl_cmd(0xB100);send_data_cmd(0xF8); + + MDELAY(5); + + send_ctrl_cmd(0xB500);send_data_cmd(0x6B); + + send_ctrl_cmd(0xB700);send_data_cmd(0x22); + send_ctrl_cmd(0xB701);send_data_cmd(0x22); + + send_ctrl_cmd(0xC800);send_data_cmd(0x01); + send_ctrl_cmd(0xC801);send_data_cmd(0x00); + send_ctrl_cmd(0xC802);send_data_cmd(0x2C); + send_ctrl_cmd(0xC803);send_data_cmd(0x13); + send_ctrl_cmd(0xC804);send_data_cmd(0x2C); + send_ctrl_cmd(0xC805);send_data_cmd(0x13); + send_ctrl_cmd(0xC806);send_data_cmd(0x2C); + send_ctrl_cmd(0xC807);send_data_cmd(0x13); + send_ctrl_cmd(0xC808);send_data_cmd(0x2C); + send_ctrl_cmd(0xC809);send_data_cmd(0x13); + send_ctrl_cmd(0xC80a);send_data_cmd(0x3F); + send_ctrl_cmd(0xC80b);send_data_cmd(0x3F); + send_ctrl_cmd(0xC80c);send_data_cmd(0x3F); + send_ctrl_cmd(0xC80d);send_data_cmd(0x3F); + send_ctrl_cmd(0xC80e);send_data_cmd(0x3F); + send_ctrl_cmd(0xC80f);send_data_cmd(0x3F); + send_ctrl_cmd(0xC810);send_data_cmd(0x3F); + send_ctrl_cmd(0xC811);send_data_cmd(0x3F); + + send_ctrl_cmd(0xB800);send_data_cmd(0x01); + send_ctrl_cmd(0xB801);send_data_cmd(0x03); + send_ctrl_cmd(0xB802);send_data_cmd(0x03); + send_ctrl_cmd(0xB803);send_data_cmd(0x03); + + send_ctrl_cmd(0xBC00);send_data_cmd(0x05); + send_ctrl_cmd(0xBC01);send_data_cmd(0x05); + send_ctrl_cmd(0xBC02);send_data_cmd(0x05); + + send_ctrl_cmd(0xD000);send_data_cmd(0x01); + + send_ctrl_cmd(0xBA00);send_data_cmd(0x01); + + send_ctrl_cmd(0xBD00);send_data_cmd(0x01); + send_ctrl_cmd(0xBD01);send_data_cmd(0x10); + send_ctrl_cmd(0xBD02);send_data_cmd(0x07); + send_ctrl_cmd(0xBD03);send_data_cmd(0x07); + + send_ctrl_cmd(0xBE00);send_data_cmd(0x01); + send_ctrl_cmd(0xBE01);send_data_cmd(0x10); + send_ctrl_cmd(0xBE02);send_data_cmd(0x07); + send_ctrl_cmd(0xBE03);send_data_cmd(0x07); + + send_ctrl_cmd(0xBF00);send_data_cmd(0x01); + send_ctrl_cmd(0xBF01);send_data_cmd(0x10); + send_ctrl_cmd(0xBF02);send_data_cmd(0x07); + send_ctrl_cmd(0xBF03);send_data_cmd(0x07); + + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x02); + + send_ctrl_cmd(0xF600);send_data_cmd(0x60); + + send_ctrl_cmd(0xEB00);send_data_cmd(0x01); + send_ctrl_cmd(0xEB01);send_data_cmd(0x26); + send_ctrl_cmd(0xEB02);send_data_cmd(0x01); + send_ctrl_cmd(0xEB03);send_data_cmd(0xC8); + send_ctrl_cmd(0xEB04);send_data_cmd(0x89); + + #ifdef TE_CONTROL + send_ctrl_cmd(0x3500);send_data_cmd(0x00); + #endif + + send_ctrl_cmd(0x3600);send_data_cmd(0xC0); + + + send_ctrl_cmd(0x2A00);send_data_cmd(0x00); + send_ctrl_cmd(0x2A01);send_data_cmd(0x00); + send_ctrl_cmd(0x2A02);send_data_cmd(HIGH_BYTE(FRAME_WIDTH)); + send_ctrl_cmd(0x2A03);send_data_cmd(LOW_BYTE(FRAME_WIDTH)); + + send_ctrl_cmd(0x2B00);send_data_cmd(0x00); + send_ctrl_cmd(0x2B01);send_data_cmd(0x00); + send_ctrl_cmd(0x2B02);send_data_cmd(HIGH_BYTE(FRAME_HEIGHT)); + send_ctrl_cmd(0x2B03);send_data_cmd(LOW_BYTE(FRAME_HEIGHT)); + + send_ctrl_cmd(0x3A00);send_data_cmd(0x55); + + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; + */ + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects bus composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects bus composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; // 2; + params->dbi.parallel.write_hold = 3; // 3; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; // 6; //6; + + params->dbi.parallel.read_setup = 2; // 2; // 4; // 3; + params->dbi.parallel.read_hold = 3; // 3; + params->dbi.parallel.read_latency = 18; // 18; + + params->dbi.parallel.wait_period = 1; // 2; // 2; + params->dbi.parallel.cs_high_width = 0; // 1; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + #ifdef TE_CONTROL + // enable tearing-free + /* + if (LCM_DBI_TE_MODE_DISABLED == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_Enable(FALSE)); + return; + } + + if (LCM_DBI_TE_MODE_VSYNC_ONLY == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY)); + } else if (LCM_DBI_TE_MODE_VSYNC_OR_HSYNC == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_OR_HSYNC)); + LCD_CHECK_RET(LCD_TE_ConfigVHSyncMode(dbi->te_hs_delay_cnt, + dbi->te_vs_width_cnt, + (LCD_TE_VS_WIDTH_CNT_DIV)dbi->te_vs_width_cnt_div)); + } else ASSERT(0); + + LCD_CHECK_RET(LCD_TE_SetEdgePolarity(dbi->te_edge_polarity)); + LCD_CHECK_RET(LCD_TE_Enable(TRUE)); + */ + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; //LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING; + + /* + * Notes: The body of the function LCD_TE_ConfigVHSyncMode() is void! + */ + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + #else + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + #endif +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(50); + send_ctrl_cmd(0x1000); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + #if 1 + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(100); // 400 + + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x01); + UDELAY(10); + + lcd_id = get_lcd_id_r(LCM_ID_REG+1) & 0xFF; + lcd_id = (lcd_id << 8) | (get_lcd_id_r(LCM_ID_REG) & 0xFF); + + LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2c00); + + //lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT(LCM_NAME"get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT(LCM_NAME"get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/baoxue_mytqt_yywi/lcm/frd402_nt35510/rfd402_nt35510.c b/baoxue_mytqt_yywi/lcm/frd402_nt35510/rfd402_nt35510.c new file mode 100644 index 0000000..658b9b3 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/frd402_nt35510/rfd402_nt35510.c @@ -0,0 +1,969 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +/* + * Notes: As for nt35512, register is 16 bits, but data is 8 bits. + * While writing, by non-nokia data format. + * While reading, by nokia data format. + * Author: chu, zewei + * Date: 2012/09/26 + */ + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +#define LCM_ID (0x5510) // reg 04h , the 2nd and 3rd parameters. +#define LCM_ID_REG (0xC500) // 0x0400 + +#define LCM_NAME "[FRD402_NT35510]" + +//#define TE_CONTROL + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + + lcm_util.send_data(data); + +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + //id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2C00); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + send_data_cmd(data); + } + } + +} + +//static unsigned int vddhh = 0x69; + +static void init_lcm_registers(void) +{ + // frd402 cmo glass + send_ctrl_cmd(0xF000);send_data_cmd(0x0055); + send_ctrl_cmd(0xF001);send_data_cmd(0x00AA); + send_ctrl_cmd(0xF002);send_data_cmd(0x0052); + send_ctrl_cmd(0xF003);send_data_cmd(0x0008); + send_ctrl_cmd(0xF004);send_data_cmd(0x0001); + + //AVDD Set AVDD 5.2V + send_ctrl_cmd(0xB000);send_data_cmd(0x000D); + send_ctrl_cmd(0xB001);send_data_cmd(0x000D); + send_ctrl_cmd(0xB002);send_data_cmd(0x000D); + + //AVDD ratio + send_ctrl_cmd(0xB600);send_data_cmd(0x0044); + send_ctrl_cmd(0xB601);send_data_cmd(0x0044); + send_ctrl_cmd(0xB602);send_data_cmd(0x0044); + + //AVEE -5.2V + send_ctrl_cmd(0xB100);send_data_cmd(0x000D); + send_ctrl_cmd(0xB101);send_data_cmd(0x000D); + send_ctrl_cmd(0xB102);send_data_cmd(0x000D); + + //AVEE ratio + send_ctrl_cmd(0xB700);send_data_cmd(0x0034); + send_ctrl_cmd(0xB701);send_data_cmd(0x0034); + send_ctrl_cmd(0xB702);send_data_cmd(0x0034); + + //VCL -2.5V + send_ctrl_cmd(0xB200);send_data_cmd(0x0000); + send_ctrl_cmd(0xB201);send_data_cmd(0x0000); + send_ctrl_cmd(0xB202);send_data_cmd(0x0000); + + //VCL ratio + send_ctrl_cmd(0xB800);send_data_cmd(0x0034); + send_ctrl_cmd(0xB801);send_data_cmd(0x0034); + send_ctrl_cmd(0xB802);send_data_cmd(0x0034); + + + //VGH 15V (Free pump) + send_ctrl_cmd(0xBF00);send_data_cmd(0x0001); + send_ctrl_cmd(0xB300);send_data_cmd(0x000F); + send_ctrl_cmd(0xB301);send_data_cmd(0x000F); + send_ctrl_cmd(0xB302);send_data_cmd(0x000F); + + //VGH ratio + send_ctrl_cmd(0xB900);send_data_cmd(0x0034); + send_ctrl_cmd(0xB901);send_data_cmd(0x0034); + send_ctrl_cmd(0xB902);send_data_cmd(0x0034); + + //VGL_REG -10V + send_ctrl_cmd(0xB500);send_data_cmd(0x0008); + send_ctrl_cmd(0xB501);send_data_cmd(0x0008); + send_ctrl_cmd(0xB502);send_data_cmd(0x0008); + + send_ctrl_cmd(0xC200);send_data_cmd(0x0003); + + //VGLX ratio + send_ctrl_cmd(0xBA00);send_data_cmd(0x0034); + send_ctrl_cmd(0xBA01);send_data_cmd(0x0034); + send_ctrl_cmd(0xBA02);send_data_cmd(0x0034); + + //VGMP/VGSP 4.5V/0V + send_ctrl_cmd(0xBC00);send_data_cmd(0x0000); + send_ctrl_cmd(0xBC01);send_data_cmd(0x0078); + send_ctrl_cmd(0xBC02);send_data_cmd(0x0000); + + //VGMN/VGSN -4.5V/0V + send_ctrl_cmd(0xBD00);send_data_cmd(0x0000); + send_ctrl_cmd(0xBD01);send_data_cmd(0x0078); + send_ctrl_cmd(0xBD02);send_data_cmd(0x0000); + + //VCOM + send_ctrl_cmd(0xBE00);send_data_cmd(0x0000); + send_ctrl_cmd(0xBE01);send_data_cmd(0x005f); + + + send_ctrl_cmd(0xD100);send_data_cmd(0x0000); + send_ctrl_cmd(0xD101);send_data_cmd(0x0033); + send_ctrl_cmd(0xD102);send_data_cmd(0x0000); + send_ctrl_cmd(0xD103);send_data_cmd(0x0034); + send_ctrl_cmd(0xD104);send_data_cmd(0x0000); + send_ctrl_cmd(0xD105);send_data_cmd(0x0037); + send_ctrl_cmd(0xD106);send_data_cmd(0x0000); + send_ctrl_cmd(0xD107);send_data_cmd(0x0043); + send_ctrl_cmd(0xD108);send_data_cmd(0x0000); + send_ctrl_cmd(0xD109);send_data_cmd(0x0052); + send_ctrl_cmd(0xD10A);send_data_cmd(0x0000); + send_ctrl_cmd(0xD10B);send_data_cmd(0x0079); + send_ctrl_cmd(0xD10C);send_data_cmd(0x0000); + send_ctrl_cmd(0xD10D);send_data_cmd(0x00A1); + send_ctrl_cmd(0xD10E);send_data_cmd(0x0000); + send_ctrl_cmd(0xD10F);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD110);send_data_cmd(0x0001); + send_ctrl_cmd(0xD111);send_data_cmd(0x0016); + send_ctrl_cmd(0xD112);send_data_cmd(0x0001); + send_ctrl_cmd(0xD113);send_data_cmd(0x005f); + send_ctrl_cmd(0xD114);send_data_cmd(0x0001); + send_ctrl_cmd(0xD115);send_data_cmd(0x008f); + send_ctrl_cmd(0xD116);send_data_cmd(0x0001); + send_ctrl_cmd(0xD117);send_data_cmd(0x00d4); + send_ctrl_cmd(0xD118);send_data_cmd(0x0002); + send_ctrl_cmd(0xD119);send_data_cmd(0x0008); + send_ctrl_cmd(0xD11A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD11B);send_data_cmd(0x0009); + send_ctrl_cmd(0xD11C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD11D);send_data_cmd(0x0037); + send_ctrl_cmd(0xD11E);send_data_cmd(0x0002); + send_ctrl_cmd(0xD11F);send_data_cmd(0x0064); + send_ctrl_cmd(0xD120);send_data_cmd(0x0002); + send_ctrl_cmd(0xD121);send_data_cmd(0x007C); + send_ctrl_cmd(0xD122);send_data_cmd(0x0002); + send_ctrl_cmd(0xD123);send_data_cmd(0x009A); + send_ctrl_cmd(0xD124);send_data_cmd(0x0002); + send_ctrl_cmd(0xD125);send_data_cmd(0x00AC); + send_ctrl_cmd(0xD126);send_data_cmd(0x0002); + send_ctrl_cmd(0xD127);send_data_cmd(0x00C3); + send_ctrl_cmd(0xD128);send_data_cmd(0x0002); + send_ctrl_cmd(0xD129);send_data_cmd(0x00D1); + send_ctrl_cmd(0xD12A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD12B);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD12C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD12D);send_data_cmd(0x00F3); + send_ctrl_cmd(0xD12E);send_data_cmd(0x0003); + send_ctrl_cmd(0xD12F);send_data_cmd(0x000A); + send_ctrl_cmd(0xD130);send_data_cmd(0x0003); + send_ctrl_cmd(0xD131);send_data_cmd(0x0041); + send_ctrl_cmd(0xD132);send_data_cmd(0x0003); + send_ctrl_cmd(0xD133);send_data_cmd(0x00B6); + + send_ctrl_cmd(0xD200);send_data_cmd(0x0000); + send_ctrl_cmd(0xD201);send_data_cmd(0x0033); + send_ctrl_cmd(0xD202);send_data_cmd(0x0000); + send_ctrl_cmd(0xD203);send_data_cmd(0x0034); + send_ctrl_cmd(0xD204);send_data_cmd(0x0000); + send_ctrl_cmd(0xD205);send_data_cmd(0x0037); + send_ctrl_cmd(0xD206);send_data_cmd(0x0000); + send_ctrl_cmd(0xD207);send_data_cmd(0x0043); + send_ctrl_cmd(0xD208);send_data_cmd(0x0000); + send_ctrl_cmd(0xD209);send_data_cmd(0x0052); + send_ctrl_cmd(0xD20A);send_data_cmd(0x0000); + send_ctrl_cmd(0xD20B);send_data_cmd(0x0079); + send_ctrl_cmd(0xD20C);send_data_cmd(0x0000); + send_ctrl_cmd(0xD20D);send_data_cmd(0x00A1); + send_ctrl_cmd(0xD20E);send_data_cmd(0x0000); + send_ctrl_cmd(0xD20F);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD210);send_data_cmd(0x0001); + send_ctrl_cmd(0xD211);send_data_cmd(0x0016); + send_ctrl_cmd(0xD212);send_data_cmd(0x0001); + send_ctrl_cmd(0xD213);send_data_cmd(0x005f); + send_ctrl_cmd(0xD214);send_data_cmd(0x0001); + send_ctrl_cmd(0xD215);send_data_cmd(0x008f); + send_ctrl_cmd(0xD216);send_data_cmd(0x0001); + send_ctrl_cmd(0xD217);send_data_cmd(0x00d4); + send_ctrl_cmd(0xD218);send_data_cmd(0x0002); + send_ctrl_cmd(0xD219);send_data_cmd(0x0008); + send_ctrl_cmd(0xD21A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD21B);send_data_cmd(0x0009); + send_ctrl_cmd(0xD21C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD21D);send_data_cmd(0x0037); + send_ctrl_cmd(0xD21E);send_data_cmd(0x0002); + send_ctrl_cmd(0xD21F);send_data_cmd(0x0064); + send_ctrl_cmd(0xD220);send_data_cmd(0x0002); + send_ctrl_cmd(0xD221);send_data_cmd(0x007C); + send_ctrl_cmd(0xD222);send_data_cmd(0x0002); + send_ctrl_cmd(0xD223);send_data_cmd(0x009A); + send_ctrl_cmd(0xD224);send_data_cmd(0x0002); + send_ctrl_cmd(0xD225);send_data_cmd(0x00AC); + send_ctrl_cmd(0xD226);send_data_cmd(0x0002); + send_ctrl_cmd(0xD227);send_data_cmd(0x00C3); + send_ctrl_cmd(0xD228);send_data_cmd(0x0002); + send_ctrl_cmd(0xD229);send_data_cmd(0x00D1); + send_ctrl_cmd(0xD22A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD22B);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD22C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD22D);send_data_cmd(0x00F3); + send_ctrl_cmd(0xD22E);send_data_cmd(0x0003); + send_ctrl_cmd(0xD22F);send_data_cmd(0x000A); + send_ctrl_cmd(0xD230);send_data_cmd(0x0003); + send_ctrl_cmd(0xD231);send_data_cmd(0x0041); + send_ctrl_cmd(0xD232);send_data_cmd(0x0003); + send_ctrl_cmd(0xD233);send_data_cmd(0x00B6); + + send_ctrl_cmd(0xD300);send_data_cmd(0x0000); + send_ctrl_cmd(0xD301);send_data_cmd(0x0033); + send_ctrl_cmd(0xD302);send_data_cmd(0x0000); + send_ctrl_cmd(0xD303);send_data_cmd(0x0034); + send_ctrl_cmd(0xD304);send_data_cmd(0x0000); + send_ctrl_cmd(0xD305);send_data_cmd(0x0037); + send_ctrl_cmd(0xD306);send_data_cmd(0x0000); + send_ctrl_cmd(0xD307);send_data_cmd(0x0043); + send_ctrl_cmd(0xD308);send_data_cmd(0x0000); + send_ctrl_cmd(0xD309);send_data_cmd(0x0052); + send_ctrl_cmd(0xD30A);send_data_cmd(0x0000); + send_ctrl_cmd(0xD30B);send_data_cmd(0x0079); + send_ctrl_cmd(0xD30C);send_data_cmd(0x0000); + send_ctrl_cmd(0xD30D);send_data_cmd(0x00A1); + send_ctrl_cmd(0xD30E);send_data_cmd(0x0000); + send_ctrl_cmd(0xD30F);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD310);send_data_cmd(0x0001); + send_ctrl_cmd(0xD311);send_data_cmd(0x0016); + send_ctrl_cmd(0xD312);send_data_cmd(0x0001); + send_ctrl_cmd(0xD313);send_data_cmd(0x005f); + send_ctrl_cmd(0xD314);send_data_cmd(0x0001); + send_ctrl_cmd(0xD315);send_data_cmd(0x008f); + send_ctrl_cmd(0xD316);send_data_cmd(0x0001); + send_ctrl_cmd(0xD317);send_data_cmd(0x00d4); + send_ctrl_cmd(0xD318);send_data_cmd(0x0002); + send_ctrl_cmd(0xD319);send_data_cmd(0x0008); + send_ctrl_cmd(0xD31A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD31B);send_data_cmd(0x0009); + send_ctrl_cmd(0xD31C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD31D);send_data_cmd(0x0037); + send_ctrl_cmd(0xD31E);send_data_cmd(0x0002); + send_ctrl_cmd(0xD31F);send_data_cmd(0x0064); + send_ctrl_cmd(0xD320);send_data_cmd(0x0002); + send_ctrl_cmd(0xD321);send_data_cmd(0x007C); + send_ctrl_cmd(0xD322);send_data_cmd(0x0002); + send_ctrl_cmd(0xD323);send_data_cmd(0x009A); + send_ctrl_cmd(0xD324);send_data_cmd(0x0002); + send_ctrl_cmd(0xD325);send_data_cmd(0x00AC); + send_ctrl_cmd(0xD326);send_data_cmd(0x0002); + send_ctrl_cmd(0xD327);send_data_cmd(0x00C3); + send_ctrl_cmd(0xD328);send_data_cmd(0x0002); + send_ctrl_cmd(0xD329);send_data_cmd(0x00D1); + send_ctrl_cmd(0xD32A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD32B);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD32C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD32D);send_data_cmd(0x00F3); + send_ctrl_cmd(0xD32E);send_data_cmd(0x0003); + send_ctrl_cmd(0xD32F);send_data_cmd(0x000A); + send_ctrl_cmd(0xD330);send_data_cmd(0x0003); + send_ctrl_cmd(0xD331);send_data_cmd(0x0041); + send_ctrl_cmd(0xD332);send_data_cmd(0x0003); + send_ctrl_cmd(0xD333);send_data_cmd(0x00B6); + + send_ctrl_cmd(0xD400);send_data_cmd(0x0000); + send_ctrl_cmd(0xD401);send_data_cmd(0x0033); + send_ctrl_cmd(0xD402);send_data_cmd(0x0000); + send_ctrl_cmd(0xD403);send_data_cmd(0x0034); + send_ctrl_cmd(0xD404);send_data_cmd(0x0000); + send_ctrl_cmd(0xD405);send_data_cmd(0x0037); + send_ctrl_cmd(0xD406);send_data_cmd(0x0000); + send_ctrl_cmd(0xD407);send_data_cmd(0x0043); + send_ctrl_cmd(0xD408);send_data_cmd(0x0000); + send_ctrl_cmd(0xD409);send_data_cmd(0x0052); + send_ctrl_cmd(0xD40A);send_data_cmd(0x0000); + send_ctrl_cmd(0xD40B);send_data_cmd(0x0079); + send_ctrl_cmd(0xD40C);send_data_cmd(0x0000); + send_ctrl_cmd(0xD40D);send_data_cmd(0x00A1); + send_ctrl_cmd(0xD40E);send_data_cmd(0x0000); + send_ctrl_cmd(0xD40F);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD410);send_data_cmd(0x0001); + send_ctrl_cmd(0xD411);send_data_cmd(0x0016); + send_ctrl_cmd(0xD412);send_data_cmd(0x0001); + send_ctrl_cmd(0xD413);send_data_cmd(0x005f); + send_ctrl_cmd(0xD414);send_data_cmd(0x0001); + send_ctrl_cmd(0xD415);send_data_cmd(0x008f); + send_ctrl_cmd(0xD416);send_data_cmd(0x0001); + send_ctrl_cmd(0xD417);send_data_cmd(0x00d4); + send_ctrl_cmd(0xD418);send_data_cmd(0x0002); + send_ctrl_cmd(0xD419);send_data_cmd(0x0008); + send_ctrl_cmd(0xD41A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD41B);send_data_cmd(0x0009); + send_ctrl_cmd(0xD41C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD41D);send_data_cmd(0x0037); + send_ctrl_cmd(0xD41E);send_data_cmd(0x0002); + send_ctrl_cmd(0xD41F);send_data_cmd(0x0064); + send_ctrl_cmd(0xD420);send_data_cmd(0x0002); + send_ctrl_cmd(0xD421);send_data_cmd(0x007C); + send_ctrl_cmd(0xD422);send_data_cmd(0x0002); + send_ctrl_cmd(0xD423);send_data_cmd(0x009A); + send_ctrl_cmd(0xD424);send_data_cmd(0x0002); + send_ctrl_cmd(0xD425);send_data_cmd(0x00AC); + send_ctrl_cmd(0xD426);send_data_cmd(0x0002); + send_ctrl_cmd(0xD427);send_data_cmd(0x00C3); + send_ctrl_cmd(0xD428);send_data_cmd(0x0002); + send_ctrl_cmd(0xD429);send_data_cmd(0x00D1); + send_ctrl_cmd(0xD42A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD42B);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD42C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD42D);send_data_cmd(0x00F3); + send_ctrl_cmd(0xD42E);send_data_cmd(0x0003); + send_ctrl_cmd(0xD42F);send_data_cmd(0x000A); + send_ctrl_cmd(0xD430);send_data_cmd(0x0003); + send_ctrl_cmd(0xD431);send_data_cmd(0x0041); + send_ctrl_cmd(0xD432);send_data_cmd(0x0003); + send_ctrl_cmd(0xD433);send_data_cmd(0x00B6); + + send_ctrl_cmd(0xD500);send_data_cmd(0x0000); + send_ctrl_cmd(0xD501);send_data_cmd(0x0033); + send_ctrl_cmd(0xD502);send_data_cmd(0x0000); + send_ctrl_cmd(0xD503);send_data_cmd(0x0034); + send_ctrl_cmd(0xD504);send_data_cmd(0x0000); + send_ctrl_cmd(0xD505);send_data_cmd(0x0037); + send_ctrl_cmd(0xD506);send_data_cmd(0x0000); + send_ctrl_cmd(0xD507);send_data_cmd(0x0043); + send_ctrl_cmd(0xD508);send_data_cmd(0x0000); + send_ctrl_cmd(0xD509);send_data_cmd(0x0052); + send_ctrl_cmd(0xD50A);send_data_cmd(0x0000); + send_ctrl_cmd(0xD50B);send_data_cmd(0x0079); + send_ctrl_cmd(0xD50C);send_data_cmd(0x0000); + send_ctrl_cmd(0xD50D);send_data_cmd(0x00A1); + send_ctrl_cmd(0xD50E);send_data_cmd(0x0000); + send_ctrl_cmd(0xD50F);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD510);send_data_cmd(0x0001); + send_ctrl_cmd(0xD511);send_data_cmd(0x0016); + send_ctrl_cmd(0xD512);send_data_cmd(0x0001); + send_ctrl_cmd(0xD513);send_data_cmd(0x005f); + send_ctrl_cmd(0xD514);send_data_cmd(0x0001); + send_ctrl_cmd(0xD515);send_data_cmd(0x008f); + send_ctrl_cmd(0xD516);send_data_cmd(0x0001); + send_ctrl_cmd(0xD517);send_data_cmd(0x00D4); + send_ctrl_cmd(0xD518);send_data_cmd(0x0002); + send_ctrl_cmd(0xD519);send_data_cmd(0x0008); + send_ctrl_cmd(0xD51A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD51B);send_data_cmd(0x0009); + send_ctrl_cmd(0xD51C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD51D);send_data_cmd(0x0037); + send_ctrl_cmd(0xD51E);send_data_cmd(0x0002); + send_ctrl_cmd(0xD51F);send_data_cmd(0x0064); + send_ctrl_cmd(0xD520);send_data_cmd(0x0002); + send_ctrl_cmd(0xD521);send_data_cmd(0x007C); + send_ctrl_cmd(0xD522);send_data_cmd(0x0002); + send_ctrl_cmd(0xD523);send_data_cmd(0x009A); + send_ctrl_cmd(0xD524);send_data_cmd(0x0002); + send_ctrl_cmd(0xD525);send_data_cmd(0x00AC); + send_ctrl_cmd(0xD526);send_data_cmd(0x0002); + send_ctrl_cmd(0xD527);send_data_cmd(0x00C3); + send_ctrl_cmd(0xD528);send_data_cmd(0x0002); + send_ctrl_cmd(0xD529);send_data_cmd(0x00D1); + send_ctrl_cmd(0xD52A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD52B);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD52C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD52D);send_data_cmd(0x00F3); + send_ctrl_cmd(0xD52E);send_data_cmd(0x0003); + send_ctrl_cmd(0xD52F);send_data_cmd(0x000A); + send_ctrl_cmd(0xD530);send_data_cmd(0x0003); + send_ctrl_cmd(0xD531);send_data_cmd(0x0041); + send_ctrl_cmd(0xD532);send_data_cmd(0x0003); + send_ctrl_cmd(0xD533);send_data_cmd(0x00B6); + + send_ctrl_cmd(0xD600);send_data_cmd(0x0000); + send_ctrl_cmd(0xD601);send_data_cmd(0x0033); + send_ctrl_cmd(0xD602);send_data_cmd(0x0000); + send_ctrl_cmd(0xD603);send_data_cmd(0x0034); + send_ctrl_cmd(0xD604);send_data_cmd(0x0000); + send_ctrl_cmd(0xD605);send_data_cmd(0x0037); + send_ctrl_cmd(0xD606);send_data_cmd(0x0000); + send_ctrl_cmd(0xD607);send_data_cmd(0x0043); + send_ctrl_cmd(0xD608);send_data_cmd(0x0000); + send_ctrl_cmd(0xD609);send_data_cmd(0x0052); + send_ctrl_cmd(0xD60A);send_data_cmd(0x0000); + send_ctrl_cmd(0xD60B);send_data_cmd(0x0079); + send_ctrl_cmd(0xD60C);send_data_cmd(0x0000); + send_ctrl_cmd(0xD60D);send_data_cmd(0x00A1); + send_ctrl_cmd(0xD60E);send_data_cmd(0x0000); + send_ctrl_cmd(0xD60F);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD610);send_data_cmd(0x0001); + send_ctrl_cmd(0xD611);send_data_cmd(0x0016); + send_ctrl_cmd(0xD612);send_data_cmd(0x0001); + send_ctrl_cmd(0xD613);send_data_cmd(0x005f); + send_ctrl_cmd(0xD614);send_data_cmd(0x0001); + send_ctrl_cmd(0xD615);send_data_cmd(0x008f); + send_ctrl_cmd(0xD616);send_data_cmd(0x0001); + send_ctrl_cmd(0xD617);send_data_cmd(0x00D4); + send_ctrl_cmd(0xD618);send_data_cmd(0x0002); + send_ctrl_cmd(0xD619);send_data_cmd(0x0008); + send_ctrl_cmd(0xD61A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD61B);send_data_cmd(0x0009); + send_ctrl_cmd(0xD61C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD61D);send_data_cmd(0x0037); + send_ctrl_cmd(0xD61E);send_data_cmd(0x0002); + send_ctrl_cmd(0xD61F);send_data_cmd(0x0064); + send_ctrl_cmd(0xD620);send_data_cmd(0x0002); + send_ctrl_cmd(0xD621);send_data_cmd(0x007C); + send_ctrl_cmd(0xD622);send_data_cmd(0x0002); + send_ctrl_cmd(0xD623);send_data_cmd(0x009A); + send_ctrl_cmd(0xD624);send_data_cmd(0x0002); + send_ctrl_cmd(0xD625);send_data_cmd(0x00AC); + send_ctrl_cmd(0xD626);send_data_cmd(0x0002); + send_ctrl_cmd(0xD627);send_data_cmd(0x00C3); + send_ctrl_cmd(0xD628);send_data_cmd(0x0002); + send_ctrl_cmd(0xD629);send_data_cmd(0x00D1); + send_ctrl_cmd(0xD62A);send_data_cmd(0x0002); + send_ctrl_cmd(0xD62B);send_data_cmd(0x00E5); + send_ctrl_cmd(0xD62C);send_data_cmd(0x0002); + send_ctrl_cmd(0xD62D);send_data_cmd(0x00F3); + send_ctrl_cmd(0xD62E);send_data_cmd(0x0003); + send_ctrl_cmd(0xD62F);send_data_cmd(0x000A); + send_ctrl_cmd(0xD630);send_data_cmd(0x0003); + send_ctrl_cmd(0xD631);send_data_cmd(0x0041); + send_ctrl_cmd(0xD632);send_data_cmd(0x0003); + send_ctrl_cmd(0xD633);send_data_cmd(0x00B6); + + //LV2 Page 0 enable + send_ctrl_cmd(0xF000);send_data_cmd(0x0055); + send_ctrl_cmd(0xF001);send_data_cmd(0x00AA); + send_ctrl_cmd(0xF002);send_data_cmd(0x0052); + send_ctrl_cmd(0xF003);send_data_cmd(0x0008); + send_ctrl_cmd(0xF004);send_data_cmd(0x0000); + + //480*854 + send_ctrl_cmd(0xB500);send_data_cmd(0x006B); + + //Display control + send_ctrl_cmd(0xB100);send_data_cmd(0x00CC); + send_ctrl_cmd(0xB101);send_data_cmd(0x0000); + + //Source hold time + send_ctrl_cmd(0xB600);send_data_cmd(0x0005); + + //Gate EQ control + send_ctrl_cmd(0xB700);send_data_cmd(0x0070); + send_ctrl_cmd(0xB701);send_data_cmd(0x0070); + + //Source EQ control (Mode 2) + send_ctrl_cmd(0xB800);send_data_cmd(0x0001); + send_ctrl_cmd(0xB801);send_data_cmd(0x0003); + send_ctrl_cmd(0xB802);send_data_cmd(0x0003); + send_ctrl_cmd(0xB803);send_data_cmd(0x0003); + + + //Inversion mode (2-dot) + send_ctrl_cmd(0xBC00);send_data_cmd(0x0002); + send_ctrl_cmd(0xBC01);send_data_cmd(0x0000); + send_ctrl_cmd(0xBC02);send_data_cmd(0x0000); + + //Timing control 4H w/ 4-Delayms( + send_ctrl_cmd(0xC900);send_data_cmd(0x00D0); + send_ctrl_cmd(0xC901);send_data_cmd(0x0002); + send_ctrl_cmd(0xC902);send_data_cmd(0x0050); + send_ctrl_cmd(0xC903);send_data_cmd(0x0050); + send_ctrl_cmd(0xC904);send_data_cmd(0x0050); + + send_ctrl_cmd(0x3500);send_data_cmd(0x0000); + + send_ctrl_cmd(0x3600);send_data_cmd(0x00C0); + send_ctrl_cmd(0x3A00);send_data_cmd(0x0055); + + send_ctrl_cmd(0x2A00);send_data_cmd(0x0000); + send_ctrl_cmd(0x2A01);send_data_cmd(0x0000); + send_ctrl_cmd(0x2A02);send_data_cmd(HIGH_BYTE(FRAME_WIDTH)); + send_ctrl_cmd(0x2A03);send_data_cmd(LOW_BYTE(FRAME_WIDTH)); + send_ctrl_cmd(0x2B00);send_data_cmd(0x0000); + send_ctrl_cmd(0x2B01);send_data_cmd(0x0000); + send_ctrl_cmd(0x2B02);send_data_cmd(HIGH_BYTE(FRAME_HEIGHT)); + send_ctrl_cmd(0x2B03);send_data_cmd(LOW_BYTE(FRAME_HEIGHT)); + send_ctrl_cmd(0x2C00); + + send_ctrl_cmd(0x1100); + MDELAY(120); + + send_ctrl_cmd(0x2900); + MDELAY(50); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; + */ + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects bus composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects bus composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; // 2; + params->dbi.parallel.write_hold = 3; // 3; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; // 6; //6; + + params->dbi.parallel.read_setup = 2; // 2; // 4; // 3; + params->dbi.parallel.read_hold = 3; // 3; + params->dbi.parallel.read_latency = 18; // 18; + + params->dbi.parallel.wait_period = 1; // 2; // 2; + params->dbi.parallel.cs_high_width = 0; // 1; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + #ifdef TE_CONTROL + // enable tearing-free + /* + if (LCM_DBI_TE_MODE_DISABLED == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_Enable(FALSE)); + return; + } + + if (LCM_DBI_TE_MODE_VSYNC_ONLY == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY)); + } else if (LCM_DBI_TE_MODE_VSYNC_OR_HSYNC == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_OR_HSYNC)); + LCD_CHECK_RET(LCD_TE_ConfigVHSyncMode(dbi->te_hs_delay_cnt, + dbi->te_vs_width_cnt, + (LCD_TE_VS_WIDTH_CNT_DIV)dbi->te_vs_width_cnt_div)); + } else ASSERT(0); + + LCD_CHECK_RET(LCD_TE_SetEdgePolarity(dbi->te_edge_polarity)); + LCD_CHECK_RET(LCD_TE_Enable(TRUE)); + */ + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; //LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING; + + /* + * Notes: The body of the function LCD_TE_ConfigVHSyncMode() is void! + */ + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + #else + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + #endif +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(50); + send_ctrl_cmd(0x1000); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + #if 1 + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(100); // 400 + + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x01); + UDELAY(10); + + lcd_id = get_lcd_id_r(LCM_ID_REG) & 0xFF; + lcd_id = (lcd_id << 8) | (get_lcd_id_r(LCM_ID_REG + 1) & 0xFF); + + LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2c00); + + //lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT(LCM_NAME"get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT(LCM_NAME"get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +/* + * Notes: As for otm8009a, register is 16 bits, but data is 8 bits. + * While writing, by non-nokia data format. + * While reading, by nokia data format. + * Author: chu, zewei + * Date: 2012/09/26 + */ + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID (0x8009) // reg a1h , the 3rd and 4th parameters. +#define LCM_ID_REG (0xA100) + +#define LCM_NAME "[GT397_OTM8009A]" + +//#define TE_CONTROL + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + + lcm_util.send_data(data); + +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + //id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2C00); + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + } + } +} +//unsigned int vddhh = 0x00; +static void init_lcm_registers(void) +{ + // gt397_otm8009a + + // HSD panel + set_lcm_register(0xff00, 0x80, 0); + set_lcm_register(0xff01, 0x09, 0); //enable EXTC + set_lcm_register(0xff02, 0x01, 0); + set_lcm_register(0xff80, 0x80, 0); //enable Orise mode + set_lcm_register(0xff81, 0x09, 0); + set_lcm_register(0xff03, 0x01, 0); //enable SPI+I2C cmd2 read + + //gamma DC + set_lcm_register(0xc0b4, 0x00, 0); //column inversion + set_lcm_register(0xC489, 0x08, 0); //reg off + set_lcm_register(0xC0a3, 0x00, 0); //pre-charge //V02 + set_lcm_register(0xC582, 0xA3, 0); //REG-pump23 + set_lcm_register(0xC590, 0x96, 0); //Pump setting (3x=D6)-->(2x=96)//v02 01/11 + set_lcm_register(0xC591, 0x87, 0); //Pump setting(VGH/VGL) + set_lcm_register(0xD800, 0x45, 0); //GVDD=4.5V 73 + set_lcm_register(0xD801, 0x45, 0); //NGVDD=4.5V 71 + + //VCOMDC + set_lcm_register(0xD900, 0x73, 0); // 0x73 + + set_lcm_register(0xE100, 0x00, 0); + set_lcm_register(0xE101, 0x00, 0); + set_lcm_register(0xE102, 0x03, 0); + set_lcm_register(0xE103, 0x08, 0); + set_lcm_register(0xE104, 0x09, 0); + set_lcm_register(0xE105, 0x14, 0); + set_lcm_register(0xE106, 0x0e, 0); + set_lcm_register(0xE107, 0x0f, 0); + set_lcm_register(0xE108, 0x00, 0); + set_lcm_register(0xE109, 0x02, 0); + set_lcm_register(0xE10A, 0x05, 0); + set_lcm_register(0xE10B, 0x07, 0); + set_lcm_register(0xE10C, 0x0e, 0); + set_lcm_register(0xE10D, 0x27, 0); + set_lcm_register(0xE10E, 0x26, 0); + set_lcm_register(0xE10F, 0x0c, 0); + + set_lcm_register(0xE200, 0x00, 0); + set_lcm_register(0xE201, 0x00, 0); + set_lcm_register(0xE202, 0x03, 0); + set_lcm_register(0xE203, 0x08, 0); + set_lcm_register(0xE204, 0x09, 0); + set_lcm_register(0xE205, 0x14, 0); + set_lcm_register(0xE206, 0x0e, 0); + set_lcm_register(0xE207, 0x0f, 0); + set_lcm_register(0xE208, 0x00, 0); + set_lcm_register(0xE209, 0x02, 0); + set_lcm_register(0xE20A, 0x05, 0); + set_lcm_register(0xE20B, 0x07, 0); + set_lcm_register(0xE20C, 0x0e, 0); + set_lcm_register(0xE20D, 0x27, 0); + set_lcm_register(0xE20E, 0x26, 0); + set_lcm_register(0xE20F, 0x0c, 0); + + + + + set_lcm_register(0xC181, 0x66, 0); //Frame rate 65Hz//V02 + + // RGB I/F setting VSYNC for OTM8018 0x0e + set_lcm_register(0xC1a1, 0x08, 0); //external Vsync,Hsync,DE + set_lcm_register(0xC0a3, 0x1b, 0); //pre-charge //V02 + set_lcm_register(0xC481, 0x83, 0); //source bias //V02 + set_lcm_register(0xC592, 0x01, 0); //Pump45 + set_lcm_register(0xC5B1, 0xA9, 0); //DC voltage setting ;[0]GVDD output, default: 0xa8 + + // CE8x : vst1, vst2, vst3, vst4 + set_lcm_register(0xCE80, 0x85, 0); // ce81[7:0] : vst1_shift[7:0] + set_lcm_register(0xCE81, 0x03, 0); // ce82[7:0] : 0000, vst1_width[3:0] + set_lcm_register(0xCE82, 0x00, 0); // ce83[7:0] : vst1_tchop[7:0] + set_lcm_register(0xCE83, 0x84, 0); // ce84[7:0] : vst2_shift[7:0] + set_lcm_register(0xCE84, 0x03, 0); // ce85[7:0] : 0000, vst2_width[3:0] + set_lcm_register(0xCE85, 0x00, 0); // ce86[7:0] : vst2_tchop[7:0] + set_lcm_register(0xCE86, 0x83, 0); // ce87[7:0] : vst3_shift[7:0] + set_lcm_register(0xCE87, 0x03, 0); // ce88[7:0] : 0000, vst3_width[3:0] + set_lcm_register(0xCE88, 0x00, 0); // ce89[7:0] : vst3_tchop[7:0] + set_lcm_register(0xCE89, 0x82, 0); // ce8a[7:0] : vst4_shift[7:0] + set_lcm_register(0xCE8a, 0x03, 0); // ce8b[7:0] : 0000, vst4_width[3:0] + set_lcm_register(0xCE8b, 0x00, 0); // ce8c[7:0] : vst4_tchop[7:0] + + //CEAx : clka1, clka2 + set_lcm_register(0xCEa0, 0x38, 0); // cea1[7:0] : clka1_width[3:0], clka1_shift[11:8] + set_lcm_register(0xCEa1, 0x02, 0); // cea2[7:0] : clka1_shift[7:0] + set_lcm_register(0xCEa2, 0x03, 0); // cea3[7:0] : clka1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEa3, 0x21, 0); // cea4[7:0] : clka1_switch[7:0] + set_lcm_register(0xCEa4, 0x00, 0); // cea5[7:0] : clka1_extend[7:0] + set_lcm_register(0xCEa5, 0x00, 0); // cea6[7:0] : clka1_tchop[7:0] + set_lcm_register(0xCEa6, 0x00, 0); // cea7[7:0] : clka1_tglue[7:0] + set_lcm_register(0xCEa7, 0x38, 0); // cea8[7:0] : clka2_width[3:0], clka2_shift[11:8] + set_lcm_register(0xCEa8, 0x01, 0); // cea9[7:0] : clka2_shift[7:0] + set_lcm_register(0xCEa9, 0x03, 0); // ceaa[7:0] : clka2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEaa, 0x22, 0); // ceab[7:0] : clka2_switch[7:0] + set_lcm_register(0xCEab, 0x00, 0); // ceac[7:0] : clka2_extend + set_lcm_register(0xCEac, 0x00, 0); // cead[7:0] : clka2_tchop + set_lcm_register(0xCEad, 0x00, 0); // ceae[7:0] : clka2_tglue + + //CEBx : clka3, clka4 + set_lcm_register(0xCEb0, 0x38, 0); // ceb1[7:0] : clka3_width[3:0], clka3_shift[11:8] + set_lcm_register(0xCEb1, 0x00, 0); // ceb2[7:0] : clka3_shift[7:0] + set_lcm_register(0xCEb2, 0x03, 0); // ceb3[7:0] : clka3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEb3, 0x23, 0); // ceb4[7:0] : clka3_switch[7:0] + set_lcm_register(0xCEb4, 0x00, 0); // ceb5[7:0] : clka3_extend[7:0] + set_lcm_register(0xCEb5, 0x00, 0); // ceb6[7:0] : clka3_tchop[7:0] + set_lcm_register(0xCEb6, 0x00, 0); // ceb7[7:0] : clka3_tglue[7:0] + set_lcm_register(0xCEb7, 0x30, 0); // ceb8[7:0] : clka4_width[3:0], clka2_shift[11:8] + set_lcm_register(0xCEb8, 0x00, 0); // ceb9[7:0] : clka4_shift[7:0] + set_lcm_register(0xCEb9, 0x03, 0); // ceba[7:0] : clka4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEba, 0x24, 0); // cebb[7:0] : clka4_switch[7:0] + set_lcm_register(0xCEbb, 0x00, 0); // cebc[7:0] : clka4_extend + set_lcm_register(0xCEbc, 0x00, 0); // cebd[7:0] : clka4_tchop + set_lcm_register(0xCEbd, 0x00, 0); // cebe[7:0] : clka4_tglue + + //CECx : clkb1, clkb2 + set_lcm_register(0xCEc0, 0x30, 0); // cec1[7:0] : clkb1_width[3:0], clkb1_shift[11:8] + set_lcm_register(0xCEc1, 0x01, 0); // cec2[7:0] : clkb1_shift[7:0] + set_lcm_register(0xCEc2, 0x03, 0); // cec3[7:0] : clkb1_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEc3, 0x25, 0); // cec4[7:0] : clkb1_switch[7:0] + set_lcm_register(0xCEc4, 0x00, 0); // cec5[7:0] : clkb1_extend[7:0] + set_lcm_register(0xCEc5, 0x00, 0); // cec6[7:0] : clkb1_tchop[7:0] + set_lcm_register(0xCEc6, 0x00, 0); // cec7[7:0] : clkb1_tglue[7:0] + set_lcm_register(0xCEc7, 0x30, 0); // cec8[7:0] : clkb2_width[3:0], clkb2_shift[11:8] + set_lcm_register(0xCEc8, 0x02, 0); // cec9[7:0] : clkb2_shift[7:0] + set_lcm_register(0xCEc9, 0x03, 0); // ceca[7:0] : clkb2_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEca, 0x26, 0); // cecb[7:0] : clkb2_switch[7:0] + set_lcm_register(0xCEcb, 0x00, 0); // cecc[7:0] : clkb2_extend + set_lcm_register(0xCEcc, 0x00, 0); // cecd[7:0] : clkb2_tchop + set_lcm_register(0xCEcd, 0x00, 0); // cece[7:0] : clkb2_tglue + + //CEDx : clkb3, clkb4 + set_lcm_register(0xCEd0, 0x30, 0); // ced1[7:0] : clkb3_width[3:0], clkb3_shift[11:8] + set_lcm_register(0xCEd1, 0x03, 0); // ced2[7:0] : clkb3_shift[7:0] + set_lcm_register(0xCEd2, 0x03, 0); // ced3[7:0] : clkb3_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEd3, 0x27, 0); // ced4[7:0] : clkb3_switch[7:0] + set_lcm_register(0xCEd4, 0x00, 0); // ced5[7:0] : clkb3_extend[7:0] + set_lcm_register(0xCEd5, 0x00, 0); // ced6[7:0] : clkb3_tchop[7:0] + set_lcm_register(0xCEd6, 0x00, 0); // ced7[7:0] : clkb3_tglue[7:0] + set_lcm_register(0xCEd7, 0x30, 0); // ced8[7:0] : clkb4_width[3:0], clkb4_shift[11:8] + set_lcm_register(0xCEd8, 0x04, 0); // ced9[7:0] : clkb4_shift[7:0] + set_lcm_register(0xCEd9, 0x03, 0); // ceda[7:0] : clkb4_sw_tg, odd_high, flat_head, flat_tail, switch[11:8] + set_lcm_register(0xCEda, 0x28, 0); // cedb[7:0] : clkb4_switch[7:0] + set_lcm_register(0xCEdb, 0x00, 0); // cedc[7:0] : clkb4_extend + set_lcm_register(0xCEdc, 0x00, 0); // cedd[7:0] : clkb4_tchop + set_lcm_register(0xCEdd, 0x00, 0); // cede[7:0] : clkb4_tglue + + //CFCx : + set_lcm_register(0xCFc0, 0x00, 0); // cfc1[7:0] : eclk_normal_width[7:0] + set_lcm_register(0xCFc1, 0x00, 0); // cfc2[7:0] : eclk_partial_width[7:0] + set_lcm_register(0xCFc2, 0x00, 0); // cfc3[7:0] : all_normal_tchop[7:0] + set_lcm_register(0xCFc3, 0x00, 0); // cfc4[7:0] : all_partial_tchop[7:0] + set_lcm_register(0xCFc4, 0x00, 0); // cfc5[7:0] : eclk1_follow[3:0], eclk2_follow[3:0] + set_lcm_register(0xCFc5, 0x00, 0); // cfc6[7:0] : eclk3_follow[3:0], eclk4_follow[3:0] + set_lcm_register(0xCFc6, 0x00, 0); // cfc7[7:0] : 00, vstmask, vendmask, 00, dir1, dir2 (0=VGL, 1=VGH) + set_lcm_register(0xCFc7, 0x00, 0); // cfc8[7:0] : reg_goa_gnd_opt, reg_goa_dpgm_tail_set, reg_goa_f_gating_en, reg_goa_f_odd_gating, toggle_mod1, 2, 3, 4 + set_lcm_register(0xCFc8, 0x00, 0); // cfc9[7:0] : duty_block[3:0], DGPM[3:0] + set_lcm_register(0xCFc9, 0x00, 0); // cfca[7:0] : reg_goa_gnd_period[7:0] + + //CFDx : + set_lcm_register(0xCFd0, 0x00, 0);// cfd1[7:0] : 0000000, reg_goa_frame_odd_high + + //-------------------------------------------------------------------------------- + // initial setting 3 < Panel setting > + //-------------------------------------------------------------------------------- + // cbcx + set_lcm_register(0xCBc0, 0x00, 0); //cbc1[7:0] : enmode H-byte of sig1 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc1, 0x00, 0); //cbc2[7:0] : enmode H-byte of sig2 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc2, 0x00, 0); //cbc3[7:0] : enmode H-byte of sig3 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc3, 0x00, 0); //cbc4[7:0] : enmode H-byte of sig4 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc4, 0x04, 0); //cbc5[7:0] : enmode H-byte of sig5 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc5, 0x04, 0); //cbc6[7:0] : enmode H-byte of sig6 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc6, 0x04, 0); //cbc7[7:0] : enmode H-byte of sig7 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc7, 0x04, 0); //cbc8[7:0] : enmode H-byte of sig8 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc8, 0x04, 0); //cbc9[7:0] : enmode H-byte of sig9 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBc9, 0x04, 0); //cbca[7:0] : enmode H-byte of sig10 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBca, 0x00, 0); //cbcb[7:0] : enmode H-byte of sig11 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcb, 0x00, 0); //cbcc[7:0] : enmode H-byte of sig12 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcc, 0x00, 0); //cbcd[7:0] : enmode H-byte of sig13 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBcd, 0x00, 0); //cbce[7:0] : enmode H-byte of sig14 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBce, 0x00, 0); //cbcf[7:0] : enmode H-byte of sig15 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cbdx + set_lcm_register(0xCBd0, 0x00, 0); //cbd1[7:0] : enmode H-byte of sig16 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd1, 0x00, 0); //cbd2[7:0] : enmode H-byte of sig17 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd2, 0x00, 0); //cbd3[7:0] : enmode H-byte of sig18 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd3, 0x00, 0); //cbd4[7:0] : enmode H-byte of sig19 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd4, 0x00, 0); //cbd5[7:0] : enmode H-byte of sig20 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd5, 0x00, 0); //cbd6[7:0] : enmode H-byte of sig21 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd6, 0x00, 0); //cbd7[7:0] : enmode H-byte of sig22 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd7, 0x00, 0); //cbd8[7:0] : enmode H-byte of sig23 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd8, 0x00, 0); //cbd9[7:0] : enmode H-byte of sig24 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBd9, 0x04, 0); //cbda[7:0] : enmode H-byte of sig25 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBda, 0x04, 0); //cbdb[7:0] : enmode H-byte of sig26 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdb, 0x04, 0); //cbdc[7:0] : enmode H-byte of sig27 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdc, 0x04, 0); //cbdd[7:0] : enmode H-byte of sig28 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBdd, 0x04, 0); //cbde[7:0] : enmode H-byte of sig29 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBde, 0x04, 0); //cbdf[7:0] : enmode H-byte of sig30 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cbex + set_lcm_register(0xCBe0, 0x00, 0); //cbe1[7:0] : enmode H-byte of sig31 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe1, 0x00, 0); //cbe2[7:0] : enmode H-byte of sig32 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe2, 0x00, 0); //cbe3[7:0] : enmode H-byte of sig33 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe3, 0x00, 0); //cbe4[7:0] : enmode H-byte of sig34 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe4, 0x00, 0); //cbe5[7:0] : enmode H-byte of sig35 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe5, 0x00, 0); //cbe6[7:0] : enmode H-byte of sig36 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe6, 0x00, 0); //cbe7[7:0] : enmode H-byte of sig37 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe7, 0x00, 0); //cbe8[7:0] : enmode H-byte of sig38 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe8, 0x00, 0); //cbe9[7:0] : enmode H-byte of sig39 (pwrof_0, pwrof_1, norm, pwron_4 ) + set_lcm_register(0xCBe9, 0x00, 0); //cbea[7:0] : enmode H-byte of sig40 (pwrof_0, pwrof_1, norm, pwron_4 ) + + // cc8x + set_lcm_register(0xCC80, 0x00, 0); //cc81[7:0] : reg setting for signal01 selection with u2d mode + set_lcm_register(0xCC81, 0x00, 0); //cc82[7:0] : reg setting for signal02 selection with u2d mode + set_lcm_register(0xCC82, 0x00, 0); //cc83[7:0] : reg setting for signal03 selection with u2d mode + set_lcm_register(0xCC83, 0x00, 0); //cc84[7:0] : reg setting for signal04 selection with u2d mode + set_lcm_register(0xCC84, 0x0C, 0); //cc85[7:0] : reg setting for signal05 selection with u2d mode + set_lcm_register(0xCC85, 0x0A, 0); //cc86[7:0] : reg setting for signal06 selection with u2d mode + set_lcm_register(0xCC86, 0x10, 0); //cc87[7:0] : reg setting for signal07 selection with u2d mode + set_lcm_register(0xCC87, 0x0E, 0); //cc88[7:0] : reg setting for signal08 selection with u2d mode + set_lcm_register(0xCC88, 0x03, 0); //cc89[7:0] : reg setting for signal09 selection with u2d mode + set_lcm_register(0xCC89, 0x04, 0); //cc8a[7:0] : reg setting for signal10 selection with u2d mode + + // cc9x + set_lcm_register(0xCC90, 0x00, 0); //cc91[7:0] : reg setting for signal11 selection with u2d mode + set_lcm_register(0xCC91, 0x00, 0); //cc92[7:0] : reg setting for signal12 selection with u2d mode + set_lcm_register(0xCC92, 0x00, 0); //cc93[7:0] : reg setting for signal13 selection with u2d mode + set_lcm_register(0xCC93, 0x00, 0); //cc94[7:0] : reg setting for signal14 selection with u2d mode + set_lcm_register(0xCC94, 0x00, 0); //cc95[7:0] : reg setting for signal15 selection with u2d mode + set_lcm_register(0xCC95, 0x00, 0); //cc96[7:0] : reg setting for signal16 selection with u2d mode + set_lcm_register(0xCC96, 0x00, 0); //cc97[7:0] : reg setting for signal17 selection with u2d mode + set_lcm_register(0xCC97, 0x00, 0); //cc98[7:0] : reg setting for signal18 selection with u2d mode + set_lcm_register(0xCC98, 0x00, 0); //cc99[7:0] : reg setting for signal19 selection with u2d mode + set_lcm_register(0xCC99, 0x00, 0); //cc9a[7:0] : reg setting for signal20 selection with u2d mode + set_lcm_register(0xCC9a, 0x00, 0); //cc9b[7:0] : reg setting for signal21 selection with u2d mode + set_lcm_register(0xCC9b, 0x00, 0); //cc9c[7:0] : reg setting for signal22 selection with u2d mode + set_lcm_register(0xCC9c, 0x00, 0); //cc9d[7:0] : reg setting for signal23 selection with u2d mode + set_lcm_register(0xCC9d, 0x00, 0); //cc9e[7:0] : reg setting for signal24 selection with u2d mode + set_lcm_register(0xCC9e, 0x0B, 0); //cc9f[7:0] : reg setting for signal25 selection with u2d mode + + // ccax + set_lcm_register(0xCCa0, 0x09, 0); //cca1[7:0] : reg setting for signal26 selection with u2d mode + set_lcm_register(0xCCa1, 0x0F, 0); //cca2[7:0] : reg setting for signal27 selection with u2d mode + set_lcm_register(0xCCa2, 0x0D, 0); //cca3[7:0] : reg setting for signal28 selection with u2d mode + set_lcm_register(0xCCa3, 0x01, 0); //cca4[7:0] : reg setting for signal29 selection with u2d mode + set_lcm_register(0xCCa4, 0x02, 0); //cca5[7:0] : reg setting for signal20 selection with u2d mode + set_lcm_register(0xCCa5, 0x00, 0); //cca6[7:0] : reg setting for signal31 selection with u2d mode + set_lcm_register(0xCCa6, 0x00, 0); //cca7[7:0] : reg setting for signal32 selection with u2d mode + set_lcm_register(0xCCa7, 0x00, 0); //cca8[7:0] : reg setting for signal33 selection with u2d mode + set_lcm_register(0xCCa8, 0x00, 0); //cca9[7:0] : reg setting for signal34 selection with u2d mode + set_lcm_register(0xCCa9, 0x00, 0); //ccaa[7:0] : reg setting for signal35 selection with u2d mode + set_lcm_register(0xCCaa, 0x00, 0); //ccab[7:0] : reg setting for signal36 selection with u2d mode + set_lcm_register(0xCCab, 0x00, 0); //ccac[7:0] : reg setting for signal37 selection with u2d mode + set_lcm_register(0xCCac, 0x00, 0); //ccad[7:0] : reg setting for signal38 selection with u2d mode + set_lcm_register(0xCCad, 0x00, 0); //ccae[7:0] : reg setting for signal39 selection with u2d mode + set_lcm_register(0xCCae, 0x00, 0); //ccaf[7:0] : reg setting for signal40 selection with u2d mode + + // ccbx + set_lcm_register(0xCCb0, 0x00, 0); //ccb1[7:0] : reg setting for signal01 selection with d2u mode + set_lcm_register(0xCCb1, 0x00, 0); //ccb2[7:0] : reg setting for signal02 selection with d2u mode + set_lcm_register(0xCCb2, 0x00, 0); //ccb3[7:0] : reg setting for signal03 selection with d2u mode + set_lcm_register(0xCCb3, 0x00, 0); //ccb4[7:0] : reg setting for signal04 selection with d2u mode + set_lcm_register(0xCCb4, 0x0D, 0); //ccb5[7:0] : reg setting for signal05 selection with d2u mode + set_lcm_register(0xCCb5, 0x0F, 0); //ccb6[7:0] : reg setting for signal06 selection with d2u mode + set_lcm_register(0xCCb6, 0x09, 0); //ccb7[7:0] : reg setting for signal07 selection with d2u mode + set_lcm_register(0xCCb7, 0x0B, 0); //ccb8[7:0] : reg setting for signal08 selection with d2u mode + set_lcm_register(0xCCb8, 0x02, 0); //ccb9[7:0] : reg setting for signal09 selection with d2u mode + set_lcm_register(0xCCb9, 0x01, 0); //ccba[7:0] : reg setting for signal10 selection with d2u mode + + // cccx + set_lcm_register(0xCCc0, 0x00, 0); //ccc1[7:0] : reg setting for signal11 selection with d2u mode + set_lcm_register(0xCCc1, 0x00, 0); //ccc2[7:0] : reg setting for signal12 selection with d2u mode + set_lcm_register(0xCCc2, 0x00, 0); //ccc3[7:0] : reg setting for signal13 selection with d2u mode + set_lcm_register(0xCCc3, 0x00, 0); //ccc4[7:0] : reg setting for signal14 selection with d2u mode + set_lcm_register(0xCCc4, 0x00, 0); //ccc5[7:0] : reg setting for signal15 selection with d2u mode + set_lcm_register(0xCCc5, 0x00, 0); //ccc6[7:0] : reg setting for signal16 selection with d2u mode + set_lcm_register(0xCCc6, 0x00, 0); //ccc7[7:0] : reg setting for signal17 selection with d2u mode + set_lcm_register(0xCCc7, 0x00, 0); //ccc8[7:0] : reg setting for signal18 selection with d2u mode + set_lcm_register(0xCCc8, 0x00, 0); //ccc9[7:0] : reg setting for signal19 selection with d2u mode + set_lcm_register(0xCCc9, 0x00, 0); //ccca[7:0] : reg setting for signal20 selection with d2u mode + set_lcm_register(0xCCca, 0x00, 0); //cccb[7:0] : reg setting for signal21 selection with d2u mode + set_lcm_register(0xCCcb, 0x00, 0); //cccc[7:0] : reg setting for signal22 selection with d2u mode + set_lcm_register(0xCCcc, 0x00, 0); //cccd[7:0] : reg setting for signal23 selection with d2u mode + set_lcm_register(0xCCcd, 0x00, 0); //ccce[7:0] : reg setting for signal24 selection with d2u mode + set_lcm_register(0xCCce, 0x0E, 0); //cccf[7:0] : reg setting for signal25 selection with d2u mode + + // ccdx + set_lcm_register(0xCCd0, 0x10, 0); //ccd1[7:0] : reg setting for signal26 selection with d2u mode + set_lcm_register(0xCCd1, 0x0A, 0); //ccd2[7:0] : reg setting for signal27 selection with d2u mode + set_lcm_register(0xCCd2, 0x0C, 0); //ccd3[7:0] : reg setting for signal28 selection with d2u mode + set_lcm_register(0xCCd3, 0x04, 0); //ccd4[7:0] : reg setting for signal29 selection with d2u mode + set_lcm_register(0xCCd4, 0x03, 0); //ccd5[7:0] : reg setting for signal30 selection with d2u mode + set_lcm_register(0xCCd5, 0x00, 0); //ccd6[7:0] : reg setting for signal31 selection with d2u mode + set_lcm_register(0xCCd6, 0x00, 0); //ccd7[7:0] : reg setting for signal32 selection with d2u mode + set_lcm_register(0xCCd7, 0x00, 0); //ccd8[7:0] : reg setting for signal33 selection with d2u mode + set_lcm_register(0xCCd8, 0x00, 0); //ccd9[7:0] : reg setting for signal34 selection with d2u mode + set_lcm_register(0xCCd9, 0x00, 0); //ccda[7:0] : reg setting for signal35 selection with d2u mode + set_lcm_register(0xCCda, 0x00, 0); //ccdb[7:0] : reg setting for signal36 selection with d2u mode + set_lcm_register(0xCCdb, 0x00, 0); //ccdc[7:0] : reg setting for signal37 selection with d2u mode + set_lcm_register(0xCCdc, 0x00, 0); //ccdd[7:0] : reg setting for signal38 selection with d2u mode + set_lcm_register(0xCCdd, 0x00, 0); //ccde[7:0] : reg setting for signal39 selection with d2u mode + set_lcm_register(0xCCde, 0x00, 0); //ccdf[7:0] : reg setting for signal40 selection with d2u mode + + #if 1 //def DISPLAY_DIRECTION_0_MODE + set_lcm_register(0x3600, 0x00, 0);// Display Direction 0 + + #ifdef TE_CONTROL + set_lcm_register(0x3500, 0x00, 0);// TE( Fmark ) Signal On + set_lcm_register(0x4400, 0x01, 0); + set_lcm_register(0x4401, 0x22, 0);// TE( Fmark ) Signal Output Position: 0x22 + #endif + #else //def DISPLAY_DIRECTION_180_MODE + set_lcm_register(0x3600, 0xD0, 0);// Display Direction 180 + + #ifdef TE_CONTROL + set_lcm_register(0x3500, 0x00, 0);// TE( Fmark ) Signal On + set_lcm_register(0x4400, 0x01, 0); + set_lcm_register(0x4401, 0xFF, 0);// TE( Fmark ) Signal Output Position + #endif + #endif + +#if 0//def LCD_BACKLIGHT_CONTROL_MODE + set_lcm_register(0x5100, 0xFF, 0);// Backlight Level Control + set_lcm_register(0x5300, 0x2C, 0);// Backlight On + set_lcm_register(0x5500, 0x00, 0);// CABC Function Off +#endif + + ///============================= + set_lcm_register(0x3A00, 0x55, 0); //MCU 16bits D[17:0] + set_lcm_register(0x2A00, 0x00, 0); + set_lcm_register(0x2A01, 0x00, 0); + set_lcm_register(0x2A02, HIGH_BYTE(FRAME_WIDTH), 0); // 0x01 + set_lcm_register(0x2A03, LOW_BYTE(FRAME_WIDTH), 0); // 0xDF + set_lcm_register(0x2B00, 0x00, 0); + set_lcm_register(0x2B01, 0x00, 0); + set_lcm_register(0x2B02, HIGH_BYTE(FRAME_HEIGHT), 0); // 0x03 + set_lcm_register(0x2B03, LOW_BYTE(FRAME_HEIGHT), 0); // 0x1F + + send_ctrl_cmd(0x2C00); + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; + */ + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects bus composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects bus composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 3; //, 4 + params->dbi.parallel.write_wait = 4; //6; + + params->dbi.parallel.read_setup = 2; // 4; // 3; + params->dbi.parallel.read_hold = 2; + params->dbi.parallel.read_latency = 18; + + params->dbi.parallel.wait_period = 1; // 2; + params->dbi.parallel.cs_high_width = 0; // 1; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + #ifdef TE_CONTROL + // enable tearing-free + /* + if (LCM_DBI_TE_MODE_DISABLED == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_Enable(FALSE)); + return; + } + + if (LCM_DBI_TE_MODE_VSYNC_ONLY == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY)); + } else if (LCM_DBI_TE_MODE_VSYNC_OR_HSYNC == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_OR_HSYNC)); + LCD_CHECK_RET(LCD_TE_ConfigVHSyncMode(dbi->te_hs_delay_cnt, + dbi->te_vs_width_cnt, + (LCD_TE_VS_WIDTH_CNT_DIV)dbi->te_vs_width_cnt_div)); + } else ASSERT(0); + + LCD_CHECK_RET(LCD_TE_SetEdgePolarity(dbi->te_edge_polarity)); + LCD_CHECK_RET(LCD_TE_Enable(TRUE)); + */ + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; //LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING; + + /* + * Notes: The body of the function LCD_TE_ConfigVHSyncMode() is void! + */ + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + #else + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + #endif +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(50); + send_ctrl_cmd(0x1000); + MDELAY(120); + +} + + +static void lcm_resume(void) +{ + #if 1 + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(10); // 400 + + set_lcm_register(0xff00, 0x80, 0); + set_lcm_register(0xff01, 0x09, 0); + set_lcm_register(0xff02, 0x01, 0); + set_lcm_register(0xff80, 0x80, 0); + set_lcm_register(0xff81, 0x09, 0); + UDELAY(10); + + lcd_id = get_lcd_id_n(LCM_ID_REG, 4) & 0xFF; + lcd_id = (lcd_id << 8) | (get_lcd_id_n(LCM_ID_REG, 5) & 0xFF); + + LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2c00); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT(LCM_NAME"get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT(LCM_NAME"get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +#if BUILD_UBOOT +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define LCMID_REG (0xd0) +#define LCM_ID (0x90) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + send_ctrl_cmd(0x2C); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x57); + + MDELAY(50); + + send_ctrl_cmd(0xB6); // + send_data_cmd(0x25); //VCOMDC 2c + + send_ctrl_cmd(0x35); // TE ON + + send_ctrl_cmd(0xB0); + send_data_cmd(0x68); //70Hz + + send_ctrl_cmd(0xCC); //Set Panel + send_data_cmd(0x09); // + + send_ctrl_cmd(0xB1); // + send_data_cmd(0x00); //DP + send_data_cmd(0x15); //BT + send_data_cmd(0x1C); //VSPR1C3F + send_data_cmd(0x1C); //VSNR1C3F + send_data_cmd(0x83); //AP + send_data_cmd(0x48); //FS + + send_ctrl_cmd(0xC0); // + send_data_cmd(0x50); //OPON + send_data_cmd(0x50); //OPON + send_data_cmd(0x01); //STBA + send_data_cmd(0x3C); //STBA + send_data_cmd(0x1E); //STBA + send_data_cmd(0x08); //GEN + + send_ctrl_cmd(0xB4); // + send_data_cmd(0x02); //NW + send_data_cmd(0x40); //RTN + send_data_cmd(0x00); //DIV + send_data_cmd(0x2A); //DUM + send_data_cmd(0x2A); //DUM + send_data_cmd(0x0D); //GDON + send_data_cmd(0x78); //GDOFF + + send_ctrl_cmd(0xE0); // + send_data_cmd(0x02); // // 1 + send_data_cmd(0x08); // // 2 + send_data_cmd(0x11); //3 + send_data_cmd(0x23); //4 + send_data_cmd(0x2C); //5 + send_data_cmd(0x40); //6 + send_data_cmd(0x4A); //7 + send_data_cmd(0x52); //8 + send_data_cmd(0x48); //9 + send_data_cmd(0x41); //10 + send_data_cmd(0x3C); //11 + send_data_cmd(0x33); //12 + send_data_cmd(0x2E); //13 + send_data_cmd(0x28); //14 + send_data_cmd(0x27); //15 + send_data_cmd(0x1B); //16 + send_data_cmd(0x02); //17 v1 + send_data_cmd(0x08); //18 + send_data_cmd(0x11); //19 + send_data_cmd(0x23); //20 + send_data_cmd(0x2C); //21 + send_data_cmd(0x40); //22 + send_data_cmd(0x4A); //23 + send_data_cmd(0x52); //24 + send_data_cmd(0x48); //25 + send_data_cmd(0x41); //26 + send_data_cmd(0x3C); //27 + send_data_cmd(0x33); //28 + send_data_cmd(0x2E); //29 + send_data_cmd(0x28); //30 + send_data_cmd(0x27); //31 + send_data_cmd(0x1B); //32 + send_data_cmd(0x00); //33 + send_data_cmd(0x01); //34 + + send_ctrl_cmd(0x3A); + send_data_cmd(0x55); + + send_ctrl_cmd(0x36); + send_data_cmd(0x00); + + send_ctrl_cmd(0x2A); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0xDF); + + send_ctrl_cmd(0x11); // SLPOUT + MDELAY(120); + + send_ctrl_cmd(0x29); // display on + MDELAY(50); + + send_ctrl_cmd(0x2C); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects buss composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects buss composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; // 2; + params->dbi.parallel.write_hold = 1; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; //6; + + params->dbi.parallel.read_setup = 3; // 3; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + //params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + //unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + + // Advises that should hold high level for about 120 ms as for HX... series lcd ic + MDELAY(120); + //MDELAY(50); + + //lcd_id = get_lcd_id_n(LCMID_REG, 2); + //LCD_PRINT("[XXD35_ILI9486L]lcm_init: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); + + #if 0 + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); + #endif +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +#if 0//ndef BUILD_UBOOT +#if 0 +typedef struct +{ + unsigned int STATUS; // 1000 +// UINT16 rsv_0002; // 1002 + unsigned int INT_ENABLE; // 1004 +// UINT16 rsv_0006; // 1006 + unsigned int INT_STATUS; // 1008 +// UINT16 rsv_000A; // 100A + unsigned int START; // 100C +// UINT16 rsv_000E; // 100E + unsigned int RESET; // 1010 + unsigned int rsv_0014[2]; // 1014..1018 + unsigned int SIF_TIMING[2]; // 101C..1020 + unsigned int rsv_0024; // 1024 + unsigned int SERIAL_CFG; // 1028 + unsigned int SIF_CS; // 102C + unsigned int PARALLEL_CFG[3]; // 1030..1038 + unsigned int PARALLEL_DW; // 103C + unsigned int GAMCON; // 1040 + unsigned int CALC_HTT; // 1044 + unsigned int SYNC_LCM_SIZE; // 1048 + unsigned int SYNC_CNT; // 104C + unsigned int TEARING_CFG; // 1050 + unsigned int GMC_CON; // 1054 + unsigned int rsv_0054[2]; // 1058..105C + unsigned int WROI_W2M_ADDR[3]; // 1060..1068 + unsigned int rsv_006c; // 106C + unsigned int W2M_PITCH; // 1070 + unsigned int rsv_0072; // 1072 + unsigned int WROI_W2M_OFFSET; // 1074 + unsigned int WROI_W2M_CONTROL; // 1078 + unsigned int rsv_007C; // 107C + unsigned int WROI_CONTROL; // 1080 + unsigned int WROI_OFFSET; // 1084 + unsigned int WROI_CMD_ADDR; // 1088 +// UINT16 rsv_008A; + unsigned int WROI_DATA_ADDR; // 108c +// UINT16 rsv_008E; + unsigned int WROI_SIZE; // 1090 + unsigned int WROI_HW_REFRESH; // 1094 + unsigned int WROI_DC; // 1098 + unsigned int WROI_BG_COLOR; // 109C + unsigned int DS_DSI_CON; // 10A0 + unsigned int rsv_00A4[3]; // 10A4..10AC + unsigned int LAYER[6]; // 10B0..11CC + unsigned int rsv_00D0[4]; // 11D0..11DC + unsigned int WROI_HWREF_BLK; // 11E0 + unsigned int WROI_HWREF_DLY; // 11E4 + unsigned int rsv_01E8[2]; // 11E8..11EC + unsigned int DITHER_CON; // 11F0 + unsigned int rsv_01F4[3]; // 11F4..11FC + unsigned int LGMA_CON[20]; // 1200..124C + unsigned int COEF_ROW[6]; // 1250..1264 +// #warning "need to implement the debug/control register" + unsigned int rsv_0268[358]; // 1268..17FC + unsigned int GAMMA[256]; // 1800..1BFF + unsigned int CMDQ[64]; // 1C00..1CFC + unsigned int rsv_1D00[128]; // 1D00..1EFC + unsigned int PCMD0; // 1F00 + unsigned int rsv_1F04[7]; // 1F04..1F1C + unsigned int PCMD1; // 1F20 + unsigned int rsv_1F24[7]; // 1F24..1F3C + unsigned int PCMD2; // 1F40 + unsigned int rsv_1F44[15]; // 1F44..1F7C + unsigned int SCMD0; // 1F80 + unsigned int rsv_1F84[7]; // 1F84..1F9C + unsigned int SCMD1; // 1FA0 + unsigned int rsv_1FA4[7]; // 1FA4..1FBC +} volatile LCD_REGS, *PLCD_REGS; + +#endif + +// mt6575_reg_base.h +//PLCD_REGS const LCD_REG = (PLCD_REGS)0xF20A1000; + +void print_lcm_registers(void) +{ + unsigned int i = 0; + unsigned int *p = 0xF20A1000; + + for (i = 0x0000; i <= 0x01F0; i += 0x0004) + { + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", (p + i), *(p + i)); + } +/* + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->INT_ENABLE, LCD_REG->INT_ENABLE); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->INT_STATUS, LCD_REG->INT_STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->START, LCD_REG->START); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->RESET, LCD_REG->RESET); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->SIF_TIMING[0], LCD_REG->SIF_TIMING[0]); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->SERIAL_CFG, LCD_REG->SERIAL_CFG); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->SIF_CS, LCD_REG->SIF_CS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->PARALLEL_CFG[0], LCD_REG->PARALLEL_CFG[0]); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->PARALLEL_DW, LCD_REG->PARALLEL_DW); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->GAMCON, LCD_REG->GAMCON); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_W2M_ADDR[0], LCD_REG->WROI_W2M_ADDR[0]); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->W2M_PITCH, LCD_REG->W2M_PITCH); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_W2M_OFFSET, LCD_REG->WROI_W2M_OFFSET); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_W2M_CONTROL, LCD_REG->WROI_W2M_CONTROL); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_CONTROL, LCD_REG->WROI_CONTROL); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_OFFSET, LCD_REG->WROI_OFFSET); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_CMD_ADDR, LCD_REG->WROI_CMD_ADDR); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_DATA_ADDR, LCD_REG->WROI_DATA_ADDR); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_SIZE, LCD_REG->WROI_SIZE); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_HW_REFRESH, LCD_REG->WROI_HW_REFRESH); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_DC, LCD_REG->WROI_DC); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_BG_COLOR, LCD_REG->WROI_BG_COLOR); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->DS_DSI_CON, LCD_REG->DS_DSI_CON); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->LAYER[0], LCD_REG->LAYER[0]); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_HWREF_BLK, LCD_REG->WROI_HWREF_BLK); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_HWREF_DLY, LCD_REG->WROI_HWREF_DLY); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->DITHER_CON, LCD_REG->DITHER_CON); +*/ + /* + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + */ +} +#endif + +static void lcm_resume(void) +{ + #if 0 + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(20); // 400 + + send_ctrl_cmd(0xB9); + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x57); + + UDELAY(10); + + lcd_id = get_lcd_id_n(LCMID_REG, 2); + LCD_PRINT("[JINCHI35_HX8357C]lcm_resume: lcd_id = 0x%x\n", lcd_id); + +#if 0//ndef BUILD_UBOOT + print_lcm_registers(); +#endif + + init_lcm_registers(); + #endif +} + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + //id = (id << 8) | (read_data_cmd() & 0xFF); + + LCD_PRINT("[JINCHI35_HX8357C]get_lcd_id_r: id = 0x%x\n", id); + + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + UDELAY(10); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT("[JINCHI35_HX8357C]get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + // Tearing effect + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ + unsigned int pwm_clk = 23706 / (1< +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +/* send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00);*/ +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 7; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 30; + params->dpi.hsync_back_porch = 16; + params->dpi.hsync_front_porch = 210; + params->dpi.vsync_pulse_width = 13; + params->dpi.vsync_back_porch = 10; + params->dpi.vsync_front_porch = 22; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA;; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + // init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +/* send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20);*/ +} + + +static void lcm_resume(void) +{ +/* send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900);*/ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ha5266_lcm_drv = +{ + .name = "ha5266", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/baoxue_mytqt_yywi/lcm/hc397_hx8352cn/hc397_hx8352cn.c b/baoxue_mytqt_yywi/lcm/hc397_hx8352cn/hc397_hx8352cn.c new file mode 100644 index 0000000..b384054 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/hc397_hx8352cn/hc397_hx8352cn.c @@ -0,0 +1,545 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) // (480) +#define FRAME_HEIGHT (400) // (800) + +#define READ_CC +#ifdef READ_CC +#define LCM_ID (0x0F) +#define LCMID_REG (0xCC) +#else +#define LCM_ID (0x9327) // 0x9327 +#define LCMID_REG (0xEF) +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + send_ctrl_cmd(0x2C); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(HIGH_BYTE(data)); + send_data_cmd(LOW_BYTE(data)); + } + } +} + +static void init_lcm_registers(void) +{ + #if 1 // + + send_ctrl_cmd(0x11); + MDELAY(120); // SLPOUT + //MDELAY(100); + + send_ctrl_cmd(0xF3 ); //Set EQ + send_data_cmd(0x08); + send_data_cmd(0x20); + send_data_cmd(0x20); + send_data_cmd(0x08); + + send_ctrl_cmd(0xE7 ); + send_data_cmd(0x60); + + send_ctrl_cmd(0xD1 ); + send_data_cmd(0x00); + send_data_cmd(0x7B); + send_data_cmd(0x17); + + send_ctrl_cmd(0xD0 ); + send_data_cmd(0x07); + send_data_cmd(0x02); + send_data_cmd(0x85); + + send_ctrl_cmd(0x36 ); + send_data_cmd(0x48); + + send_ctrl_cmd(0xC1 ); + send_data_cmd(0x10); + send_data_cmd(0x1A); + send_data_cmd(0x02); + send_data_cmd(0x02); + + send_ctrl_cmd(0xC0 ); + send_data_cmd(0x05); // 0x00 + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x02); + + + send_ctrl_cmd(0xC4 ); + send_data_cmd(0x00); + + send_ctrl_cmd(0xC5 ); + send_data_cmd(0x0c); + + send_ctrl_cmd(0xD2 ); + send_data_cmd(0x01); + send_data_cmd(0x22); + + //GAMMA2.2 + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x57); + send_data_cmd(0x34); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x02); + send_data_cmd(0x34); + send_data_cmd(0x02); + send_data_cmd(0x77); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x0F); + send_data_cmd(0x08); + send_data_cmd(0x80); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x55); + + send_ctrl_cmd(0x2A); // set cloumn adrdress + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0xEF); + + send_ctrl_cmd(0x2B); // set page adrdress + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x8F); + + send_ctrl_cmd(0x29); // display on + MDELAY(120); + //send_ctrl_cmd(0x2C); + #endif +} + + + + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects buss composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects buss composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_8BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_8_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + +/* +ASSERT(id >= LCD_IF_PARALLEL_0 && id <= LCD_IF_PARALLEL_2); + ASSERT(writeSetup <= 15U); + ASSERT(writeHold <= 4U); + ASSERT(writeWait <= 64U); + ASSERT(readSetup <= 15U); + ASSERT(readLatency <= 64U); + ASSERT(waitPeriod <= 1023U); +*/ + params->dbi.parallel.write_setup = 1; // 2; + params->dbi.parallel.write_hold = 1; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; //6; + + params->dbi.parallel.read_setup = 3; // 3; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + //params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + +static void lcm_init(void) +{ + //unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + + // Advises that should hold high level for about 120 ms as for HX... series lcd ic + MDELAY(120); + + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + #if 0 + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(120); // 400 + + #ifdef READ_CC + lcd_id = get_lcd_id_n(LCMID_REG, 2); + #else + lcd_id = get_lcd_id_n(LCMID_REG, 4); + lcd_id = (lcd_id << 8) | (get_lcd_id_n(0xEF, 5) & 0xff); + #endif + + LCD_PRINT("[HC397_HX8352CN]lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + id = (id << 8) | (read_data_cmd() & 0xFF); + + LCD_PRINT("[HC397_HX8352CN]get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT("[HC397_HX8352CN]get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 8; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 48; + params->dpi.hsync_back_porch = 40; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 29; + params->dpi.vsync_front_porch = 13; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + //program reset pin + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +} + + +static void lcm_suspend(void) +{ +//disable output pixel clk +} + + +static void lcm_resume(void) +{ +//enable output pixel clk +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hsd070idw1_lcm_drv = +{ + .name = "hsd070idw1", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/baoxue_mytqt_yywi/lcm/hx8357B/hx8357b.c b/baoxue_mytqt_yywi/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..f33e7fd --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/hx8357B/hx8357b.c @@ -0,0 +1,317 @@ +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/baoxue_mytqt_yywi/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c b/baoxue_mytqt_yywi/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c new file mode 100644 index 0000000..3abdeb9 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c @@ -0,0 +1,417 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + + {0xB4, 7, {0x00, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x8C}}, + {REGFLAG_DELAY, 10, {}}, + + //{0xCC, 1, {0x01}}, + //{REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x87, 0x8C, 0xCF, 0xD3, + 0xD6, 0x14, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x87, 0x8C, 0xCF, + 0xD3, 0xD6, 0x14, 0x15, + 0x12, 0x18}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x10}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x2, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0xff);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x02);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + sw_clear_panel(0); + send_ctrl_cmd(0x10); + MDELAY(5); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + send_ctrl_cmd(0xC3); + send_data_cmd(0xFF); + + send_ctrl_cmd(0xF4); + read_data_cmd(); + return (LCM_ID == read_data_cmd())?1:0; +} + +LCM_DRIVER hx8369_6575_lcm_drv = +{ + .name = "hx8369_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id, +}; + + diff --git a/baoxue_mytqt_yywi/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c b/baoxue_mytqt_yywi/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c new file mode 100644 index 0000000..9caf965 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c @@ -0,0 +1,508 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, ///apply it as ESD indication + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +#if defined(LCM_DSI_CMD_MODE) + { + data_array[0]=0x00043902; + data_array[1]=0x6983FFB9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00103902; + data_array[1]=0x032000B2; + data_array[2]=0xFF007003; + data_array[3]=0x00000000; + data_array[4]=0x01000303; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0]=0x00063902; + data_array[1]=0x700800B4; + data_array[2]=0x0000060E; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; + data_array[1] = 0x030100D5; + data_array[2] = 0x08020100; + data_array[3] = 0x00131180; + data_array[4] = 0x51064000; + data_array[5] = 0x71000007; + data_array[6] = 0x07046005; + data_array[7] = 0x0000060F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00143902; + data_array[1] = 0x340085B1; + data_array[2] = 0x0E0E0006; + data_array[3] = 0x1A1A2C24; + data_array[4] = 0xE6013A07; + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + // color format + { + // RGB565 + //data_array[0] = 0x053A1500; + // RGB666 + //data_array[0] = 0x063A1500; + // RGB888 + data_array[0] = 0x073A1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } + + data_array[0] = 0x02CC1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00033902; + data_array[1] = 0x006C6CB6 ; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + // ENABLE FMARK + //data_array[0] = 0x00023902; + //data_array[1] = 0x00000035 ; + //dsi_set_cmdq(&data_array, 2, 1); + //MDELAY(10); + + //data_array[0] = 0x00351500; + //dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(10); + + // SET GAMMA + data_array[0] = 0x00233902; + data_array[1] = 0x140C00E0; + data_array[2] = 0x293F3F3F; + data_array[3] = 0x0F0C0654; + data_array[4] = 0x15131513; + data_array[5] = 0x0C001F14; + data_array[6] = 0x3F3F3F14; + data_array[7] = 0x0C065429; + data_array[8] = 0x1315130F; + data_array[9] = 0x001F1415; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + + data_array[0] = 0x000E3902; //// SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA ; + data_array[2] = 0x10000A00 ; + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018 ; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + } +#else + { + data_array[0] = 0x00043902; // SET password + data_array[1] = 0x6983FFB9; // + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x00143902; //// SET Power + data_array[1] = 0x340085B1; // + data_array[2] = 0x0F0F0007; // + data_array[3] = 0x3F3F322A; // + data_array[4] = 0xE6013A01; // + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + data_array[0] = 0x00103902; //// SET Display 480x800 + data_array[1] = 0x032300B2; // + data_array[2] = 0xFF007003; // + data_array[3] = 0x00000000; // + data_array[4] = 0x01000303; // + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00063902; // SET Display + data_array[1] = 0x801800B4; + data_array[2] = 0x00000206; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x00033902; //// SET VCOM + data_array[1] = 0x004242B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; //// SET GIP + data_array[1] = 0x030400D5; + data_array[2] = 0x28050100; + data_array[3] = 0x00030170; + data_array[4] = 0x51064000; + data_array[5] = 0x41000007; + data_array[6] = 0x07075006; + data_array[7] = 0x0000040F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00233902; //// SET GAMMA + data_array[1] = 0x191300E0; // + data_array[2] = 0x283F3D38; // + data_array[3] = 0x0E0D0746; // + data_array[4] = 0x14121512; // + data_array[5] = 0x1300170F; + data_array[6] = 0x3F3D3819; + data_array[7] = 0x0D074628; + data_array[8] = 0x1215120E; + data_array[9] = 0x00170F14; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + +#if 0 + switch(g_ColorFormat) + { + case PACKED_RGB565: + data_array[0] = 0x553A1500; // SET pixel format + break; + + case LOOSED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + case PACKED_RGB888: + data_array[0] = 0x773A1500; // SET pixel format + break; + + case PACKED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + default: + //dbg_print("Format setting error \n\r"); + while(1); + break; + } + + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +#endif + data_array[0] = 0x000E3902; // SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA; // + data_array[2] = 0x10000A00; // + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } +#endif + //------------------------------------------------------------------------ + // LUT for HX8369 + //------------------------------------------------------------------------ + if (0)//(g_ColorFormat==0) + { + data_array[0] = 0x00C13902; //Set Color LUT 1 + data_array[1] = 0x1008002D; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000FF; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT 2 + data_array[1] = 0x08040000; + data_array[2] = 0x1814100C; + data_array[3] = 0x2824201C; + data_array[4] = 0x3834302C; + data_array[5] = 0x4844403C; + data_array[6] = 0x5854504C; + data_array[7] = 0x6864605C; + data_array[8] = 0x7874706C; + data_array[9] = 0x8884807C; + data_array[10] = 0x9894908C; + data_array[11] = 0xA8A4A09C; + data_array[12] = 0xB8B4B0AC; + data_array[13] = 0xC8C4C0BC; + data_array[14] = 0xD8D4D0CC; + data_array[15] = 0xE8E4E0DC; + dsi_set_cmdq(&data_array, 16, 1); + + MDELAY(10); + + data_array[0] = 0xF8F4F0EC; //Set Color LUT 3 + data_array[1] = 0x100800FC; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000F8; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT + data_array[1] = 0x00000000; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + } + +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // DBI + //params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + //params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // DPI + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.intermediat_buffer_num = 2; + + // DSI + params->dsi.DSI_WMEM_CONTI=0x3C; + params->dsi.DSI_RMEM_CONTI=0x3E; + //params->dsi.LANE_NUM=LCM_ONE_LANE; + params->dsi.LANE_NUM=LCM_TWO_LANE; + params->dsi.VC_NUM=0x0; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; +/* + params->dsi.HS_TRAIL=0x14; + params->dsi.HS_ZERO=0x14; + params->dsi.HS_PRPR=0x0A; + params->dsi.LPX=0x05; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x37; + params->dsi.TA_SURE=0x16; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x14; + params->dsi.CLK_ZERO=0x14; + params->dsi.LPX_WAIT=0x0A; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x0A; +*/ + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + + //params->dsi.pll_div2=4; // div2=0~15: fout=fvo/(2*div2) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + { + unsigned int data_array[16]; + unsigned int divider=4; + data_array[0]=0x000A3902; // Display Off + data_array[1]=0x00003EC9; + data_array[2]=0x1E0e0001|((0xE|(divider<<4))<<8); + data_array[3]=0x001E; + dsi_set_cmdq(&data_array, 4, 1); + + } +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + //data_array[6]= 0x002c3901; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + unsigned int data_array[16]; + +//for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + { + mapped_level = default_level+(level)*(255-default_level)/(255); + } + else + { + mapped_level=0; + } + + data_array[0]= 0x00023902; + data_array[1]= (0x51 | (mapped_level << 8)); + + dsi_set_cmdq(&data_array, 2, 1); + + + +} + + + + + +static void lcm_setpwm(unsigned int divider) +{ + unsigned int data_array[16]; + + data_array[0]= 0x000A3902; + data_array[1]= 0x00003EC9; + data_array[2]= 0x1E020001|((0xF|(divider<<4))<<8); + data_array[3]= 0x001E; + + dsi_set_cmdq(&data_array, 4, 1); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 5, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 5, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 5, {}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 5, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active = 3; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +/* // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING;*/ +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XAA +#define REGFLAG_END_OF_TABLE 0xAB // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[128]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + + {0xB1, 10, {0x12, 0x83, 0x77, 0x00, + 0x8F, 0x0F, 0x1A, 0x1A, + 0x0C, 0x0A}}, + + {0xB2, 3, {0x00, 0x10, 0x02}}, + + {0xB3, 4, {0x83, 0x00, 0x31, 0x03}}, + + {0xB4, 1, {0x42}}, + + {0xB6, 2, {0x7F, 0x7F}}, + + {0xE3, 4, {0x01, 0x01, 0x01, 0x01}}, + + {0xC0, 6, {0x73, 0x50, 0x00, 0x3C, + 0xC4, 0x00}}, + + {0xCC, 1, {0x00}}, + +#if 1 + {0xD5, 92, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#else + {0xD5, 59, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00}}, + + {0xFD, 34, { + 0xAA, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#endif + +#if 0 + {0xD5, 56, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00}}, + + {0xFD, 37, {0xAA, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#endif + + {0xE0, 35, {0x00, 0x0C, 0x00, 0x10, + 0x14, 0x3C, 0x27, 0x34, + 0x0C, 0x10, 0x11, 0x15, + 0x18, 0x16, 0x16, 0x13, + 0x18, 0x0C, 0x00, 0x0C, + 0x10, 0x14, 0x3C, 0x27, + 0x34, 0x0C, 0x10, 0x11, + 0x15, 0x18, 0x16, 0x16, + 0x13, 0x18, 0x01}}, + + {0xEA, 1, {0x62}}, + + {0x3A, 1, {0x77}}, + + {0xBA, 15, {0x11, 0x00, 0x16, 0xC6, + 0x00, 0x0A, 0x00, 0x10, + 0x24, 0x02, 0x21, 0x21, + 0x9A, 0x17, 0x1D}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i, j, k; + unsigned int para_int, read_int; + unsigned char buffer[256]; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); +#if 0 + do { + read_int = read_reg(cmd); + para_int = *((unsigned int *)table[i].para_list); + printf("%s, compare = {%04x, %04x} \n", __func__, read_int, para_int); + } while(read_int != para_int); +#endif + } + } + +#if 0//defined(BUILD_UBOOT) + int remain_bytes; + int r_byte_count; + unsigned int array[16]; + + for(i = 0; i < count; i++) { + if(table[i].cmd != REGFLAG_DELAY && table[i].cmd != REGFLAG_END_OF_TABLE) + { + remain_bytes = table[i].count; + j = 0; + + do { + //printf("Read 0x%02x round %d. Remain %d bytes \n", table[i].cmd, j, remain_bytes); + r_byte_count = (remain_bytes > 8) ? 8 : remain_bytes; + + array[0] = 0x00003700 | (r_byte_count<<16);// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + + if(j>0) + read_reg_v2(0xFD, (buffer + j*8), r_byte_count); + else + read_reg_v2(table[i].cmd, buffer, r_byte_count); + + j++; + remain_bytes-=8; + } while(remain_bytes>0); + + printf("0x%02X[%02d] => { ", table[i].cmd, table[i].count); + for(k = 0; k < table[i].count; k++) + { + if((k % 4 ) == 0 && k > 0) + printf("\n ", buffer[k]); + printf("0x%02X ", buffer[k]); + } + printf("} \n"); + + } + } +#endif + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + params->dsi.word_count=480*3; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.vertical_sync_active = 10; + params->dsi.vertical_backporch = 10; + params->dsi.vertical_frontporch = 10; // 2 + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 50; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=28; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + + +static void lcm_init(void) +{ + unsigned char buffer[10]; + unsigned int array[16]; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // AUO 3.17" + ILI9481 + + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); + send_data_cmd(0X0007); + send_data_cmd(0X0041); + send_data_cmd(0X001B); + + send_ctrl_cmd(0X00D1); + send_data_cmd(0X0000); + send_data_cmd(0X0016); // 0x001b + send_data_cmd(0X0012); + + send_ctrl_cmd(0X00D2); + send_data_cmd(0X0001); + send_data_cmd(0X0011); + + send_ctrl_cmd(0X00C0); + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X00F3); + send_data_cmd(0X0040); + send_data_cmd(0X000A); + send_ctrl_cmd(0X00F6); + send_data_cmd(0X0080); + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0080); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x29); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, +}; diff --git a/baoxue_mytqt_yywi/lcm/inc/lcm_drv.h b/baoxue_mytqt_yywi/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..7ad0bfd --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/inc/lcm_drv.h @@ -0,0 +1,536 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), + LCM_DRIVING_CURRENT_6575_4MA = (1 << 4), + LCM_DRIVING_CURRENT_6575_8MA = (3 << 4), + LCM_DRIVING_CURRENT_6575_12MA = (2 << 4), + LCM_DRIVING_CURRENT_6575_16MA = (4 << 4) +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4, + LCM_DBI_DATA_WIDTH_32BITS = 5 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; + + +/* DSI related enumerations */ + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_DSI_FORMAT_RGB565 = 0, + LCM_DSI_FORMAT_RGB666 = 1, + LCM_DSI_FORMAT_RGB888 = 2 +} LCM_DSI_FORMAT; + + +typedef enum +{ + LCM_DSI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DSI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DSI_TRANS_SEQ; + + +typedef enum +{ + LCM_DSI_PADDING_ON_LSB = 0, + LCM_DSI_PADDING_ON_MSB = 1 +} LCM_DSI_PADDING; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +////////////////////////////////////MT6575 added params, and if lcm driver is for 6575, only care these below params + unsigned int css; + unsigned int csh; + unsigned int rd_1st; + unsigned int rd_2nd; + unsigned int wr_1st; + unsigned int wr_2nd; + + unsigned int sif_3wire; + unsigned int sif_sdi; + LCM_POLARITY sif_1st_pol; + LCM_POLARITY sif_sck_def; + unsigned int sif_div2; + unsigned int sif_hw_cs; +//////////////////////////////////// +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_hold; + unsigned int read_latency; + unsigned int wait_period; + /*only for 6575*/ + unsigned int cs_high_width; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DSI_TRANS_SEQ trans_seq; + LCM_DSI_PADDING padding; + LCM_DSI_FORMAT format; +} LCM_DSI_DATA_FORMAT; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + unsigned int i2x_en; + unsigned int i2x_edge; + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + + LCM_LANE_NUM LANE_NUM; + LCM_DSI_DATA_FORMAT data_format; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int packet_size; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int horizontal_sync_active; + unsigned int horizontal_backporch; + unsigned int horizontal_frontporch; + unsigned int horizontal_active_pixel; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; + + unsigned int lcm_int_te_monitor; + unsigned int lcm_int_te_period; + + unsigned int lcm_ext_te_monitor; + + unsigned int noncont_clock; + unsigned int noncont_clock_period; + +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq_V2)(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update); + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + unsigned int (*dsi_dcs_read_lcm_reg)(unsigned char cmd); + unsigned int (*dsi_dcs_read_lcm_reg_v2)(unsigned char cmd, unsigned char *buffer, unsigned char buffer_size); + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned char pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); +///////////////////////////CABC backlight related function + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); +/////////////////////////// + +/////////////ESD_RECOVERY////////////////////// + unsigned int (*esd_check)(void); + unsigned int (*esd_recover)(void); + +///////////////////////////////////////////////// + +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/baoxue_mytqt_yywi/lcm/jinchi35_hx8357c/jinchi35_hx8357c.c b/baoxue_mytqt_yywi/lcm/jinchi35_hx8357c/jinchi35_hx8357c.c new file mode 100644 index 0000000..d6353b4 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/jinchi35_hx8357c/jinchi35_hx8357c.c @@ -0,0 +1,639 @@ +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define LCMID_REG (0xd0) +#define LCM_ID (0x90) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + send_ctrl_cmd(0x2C); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x57); + + MDELAY(50); + + send_ctrl_cmd(0xB6); // + send_data_cmd(0x25); //VCOMDC 2c + + send_ctrl_cmd(0x35); // TE ON + + send_ctrl_cmd(0xB0); + send_data_cmd(0x68); //70Hz + + send_ctrl_cmd(0xCC); //Set Panel + send_data_cmd(0x09); // + + send_ctrl_cmd(0xB1); // + send_data_cmd(0x00); //DP + send_data_cmd(0x15); //BT + send_data_cmd(0x1C); //VSPR1C3F + send_data_cmd(0x1C); //VSNR1C3F + send_data_cmd(0x83); //AP + send_data_cmd(0x48); //FS + + send_ctrl_cmd(0xC0); // + send_data_cmd(0x50); //OPON + send_data_cmd(0x50); //OPON + send_data_cmd(0x01); //STBA + send_data_cmd(0x3C); //STBA + send_data_cmd(0x1E); //STBA + send_data_cmd(0x08); //GEN + + send_ctrl_cmd(0xB4); // + send_data_cmd(0x02); //NW + send_data_cmd(0x40); //RTN + send_data_cmd(0x00); //DIV + send_data_cmd(0x2A); //DUM + send_data_cmd(0x2A); //DUM + send_data_cmd(0x0D); //GDON + send_data_cmd(0x78); //GDOFF + + send_ctrl_cmd(0xE0); // + send_data_cmd(0x02); // // 1 + send_data_cmd(0x08); // // 2 + send_data_cmd(0x11); //3 + send_data_cmd(0x23); //4 + send_data_cmd(0x2C); //5 + send_data_cmd(0x40); //6 + send_data_cmd(0x4A); //7 + send_data_cmd(0x52); //8 + send_data_cmd(0x48); //9 + send_data_cmd(0x41); //10 + send_data_cmd(0x3C); //11 + send_data_cmd(0x33); //12 + send_data_cmd(0x2E); //13 + send_data_cmd(0x28); //14 + send_data_cmd(0x27); //15 + send_data_cmd(0x1B); //16 + send_data_cmd(0x02); //17 v1 + send_data_cmd(0x08); //18 + send_data_cmd(0x11); //19 + send_data_cmd(0x23); //20 + send_data_cmd(0x2C); //21 + send_data_cmd(0x40); //22 + send_data_cmd(0x4A); //23 + send_data_cmd(0x52); //24 + send_data_cmd(0x48); //25 + send_data_cmd(0x41); //26 + send_data_cmd(0x3C); //27 + send_data_cmd(0x33); //28 + send_data_cmd(0x2E); //29 + send_data_cmd(0x28); //30 + send_data_cmd(0x27); //31 + send_data_cmd(0x1B); //32 + send_data_cmd(0x00); //33 + send_data_cmd(0x01); //34 + + send_ctrl_cmd(0x3A); + send_data_cmd(0x55); + + send_ctrl_cmd(0x36); + send_data_cmd(0x00); + + send_ctrl_cmd(0x2A); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + + send_ctrl_cmd(0x2B); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0xDF); + + send_ctrl_cmd(0x11); // SLPOUT + MDELAY(120); + + send_ctrl_cmd(0x29); // display on + MDELAY(50); + + send_ctrl_cmd(0x2C); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects buss composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects buss composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; // 2; + params->dbi.parallel.write_hold = 1; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; //6; + + params->dbi.parallel.read_setup = 3; // 3; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + //params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + //unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + + // Advises that should hold high level for about 120 ms as for HX... series lcd ic + MDELAY(120); + //MDELAY(50); + + //lcd_id = get_lcd_id_n(LCMID_REG, 2); + //LCD_PRINT("[XXD35_ILI9486L]lcm_init: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); + + #if 0 + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); + #endif +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +#if 0//ndef BUILD_UBOOT +#if 0 +typedef struct +{ + unsigned int STATUS; // 1000 +// UINT16 rsv_0002; // 1002 + unsigned int INT_ENABLE; // 1004 +// UINT16 rsv_0006; // 1006 + unsigned int INT_STATUS; // 1008 +// UINT16 rsv_000A; // 100A + unsigned int START; // 100C +// UINT16 rsv_000E; // 100E + unsigned int RESET; // 1010 + unsigned int rsv_0014[2]; // 1014..1018 + unsigned int SIF_TIMING[2]; // 101C..1020 + unsigned int rsv_0024; // 1024 + unsigned int SERIAL_CFG; // 1028 + unsigned int SIF_CS; // 102C + unsigned int PARALLEL_CFG[3]; // 1030..1038 + unsigned int PARALLEL_DW; // 103C + unsigned int GAMCON; // 1040 + unsigned int CALC_HTT; // 1044 + unsigned int SYNC_LCM_SIZE; // 1048 + unsigned int SYNC_CNT; // 104C + unsigned int TEARING_CFG; // 1050 + unsigned int GMC_CON; // 1054 + unsigned int rsv_0054[2]; // 1058..105C + unsigned int WROI_W2M_ADDR[3]; // 1060..1068 + unsigned int rsv_006c; // 106C + unsigned int W2M_PITCH; // 1070 + unsigned int rsv_0072; // 1072 + unsigned int WROI_W2M_OFFSET; // 1074 + unsigned int WROI_W2M_CONTROL; // 1078 + unsigned int rsv_007C; // 107C + unsigned int WROI_CONTROL; // 1080 + unsigned int WROI_OFFSET; // 1084 + unsigned int WROI_CMD_ADDR; // 1088 +// UINT16 rsv_008A; + unsigned int WROI_DATA_ADDR; // 108c +// UINT16 rsv_008E; + unsigned int WROI_SIZE; // 1090 + unsigned int WROI_HW_REFRESH; // 1094 + unsigned int WROI_DC; // 1098 + unsigned int WROI_BG_COLOR; // 109C + unsigned int DS_DSI_CON; // 10A0 + unsigned int rsv_00A4[3]; // 10A4..10AC + unsigned int LAYER[6]; // 10B0..11CC + unsigned int rsv_00D0[4]; // 11D0..11DC + unsigned int WROI_HWREF_BLK; // 11E0 + unsigned int WROI_HWREF_DLY; // 11E4 + unsigned int rsv_01E8[2]; // 11E8..11EC + unsigned int DITHER_CON; // 11F0 + unsigned int rsv_01F4[3]; // 11F4..11FC + unsigned int LGMA_CON[20]; // 1200..124C + unsigned int COEF_ROW[6]; // 1250..1264 +// #warning "need to implement the debug/control register" + unsigned int rsv_0268[358]; // 1268..17FC + unsigned int GAMMA[256]; // 1800..1BFF + unsigned int CMDQ[64]; // 1C00..1CFC + unsigned int rsv_1D00[128]; // 1D00..1EFC + unsigned int PCMD0; // 1F00 + unsigned int rsv_1F04[7]; // 1F04..1F1C + unsigned int PCMD1; // 1F20 + unsigned int rsv_1F24[7]; // 1F24..1F3C + unsigned int PCMD2; // 1F40 + unsigned int rsv_1F44[15]; // 1F44..1F7C + unsigned int SCMD0; // 1F80 + unsigned int rsv_1F84[7]; // 1F84..1F9C + unsigned int SCMD1; // 1FA0 + unsigned int rsv_1FA4[7]; // 1FA4..1FBC +} volatile LCD_REGS, *PLCD_REGS; + +#endif + +// mt6575_reg_base.h +//PLCD_REGS const LCD_REG = (PLCD_REGS)0xF20A1000; + +void print_lcm_registers(void) +{ + unsigned int i = 0; + unsigned int *p = 0xF20A1000; + + for (i = 0x0000; i <= 0x01F0; i += 0x0004) + { + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", (p + i), *(p + i)); + } +/* + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->INT_ENABLE, LCD_REG->INT_ENABLE); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->INT_STATUS, LCD_REG->INT_STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->START, LCD_REG->START); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->RESET, LCD_REG->RESET); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->SIF_TIMING[0], LCD_REG->SIF_TIMING[0]); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->SERIAL_CFG, LCD_REG->SERIAL_CFG); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->SIF_CS, LCD_REG->SIF_CS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->PARALLEL_CFG[0], LCD_REG->PARALLEL_CFG[0]); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->PARALLEL_DW, LCD_REG->PARALLEL_DW); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->GAMCON, LCD_REG->GAMCON); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_W2M_ADDR[0], LCD_REG->WROI_W2M_ADDR[0]); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->W2M_PITCH, LCD_REG->W2M_PITCH); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_W2M_OFFSET, LCD_REG->WROI_W2M_OFFSET); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_W2M_CONTROL, LCD_REG->WROI_W2M_CONTROL); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_CONTROL, LCD_REG->WROI_CONTROL); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_OFFSET, LCD_REG->WROI_OFFSET); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_CMD_ADDR, LCD_REG->WROI_CMD_ADDR); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_DATA_ADDR, LCD_REG->WROI_DATA_ADDR); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_SIZE, LCD_REG->WROI_SIZE); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_HW_REFRESH, LCD_REG->WROI_HW_REFRESH); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_DC, LCD_REG->WROI_DC); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_BG_COLOR, LCD_REG->WROI_BG_COLOR); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->DS_DSI_CON, LCD_REG->DS_DSI_CON); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->LAYER[0], LCD_REG->LAYER[0]); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_HWREF_BLK, LCD_REG->WROI_HWREF_BLK); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->WROI_HWREF_DLY, LCD_REG->WROI_HWREF_DLY); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->DITHER_CON, LCD_REG->DITHER_CON); +*/ + /* + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + LCD_PRINT("[JINCHI35_HX8357C] LCD_REG (%p) = 0x%x\n", &LCD_REG->STATUS, LCD_REG->STATUS); + */ +} +#endif + +static void lcm_resume(void) +{ + #if 1 + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(20); // 400 + + send_ctrl_cmd(0xB9); + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x57); + + UDELAY(10); + + lcd_id = get_lcd_id_n(LCMID_REG, 2); + LCD_PRINT("[JINCHI35_HX8357C]lcm_resume: lcd_id = 0x%x\n", lcd_id); + +#if 0//ndef BUILD_UBOOT + print_lcm_registers(); +#endif + + init_lcm_registers(); + #endif +} + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + //id = (id << 8) | (read_data_cmd() & 0xFF); + + LCD_PRINT("[JINCHI35_HX8357C]get_lcd_id_r: id = 0x%x\n", id); + + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + UDELAY(10); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT("[JINCHI35_HX8357C]get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + // Tearing effect + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ + unsigned int pwm_clk = 23706 / (1< +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/baoxue_mytqt_yywi/lcm/lvds_wsvga/lvds_wsvga.c b/baoxue_mytqt_yywi/lcm/lvds_wsvga/lvds_wsvga.c new file mode 100644 index 0000000..ca68a3b --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/lvds_wsvga/lvds_wsvga.c @@ -0,0 +1,202 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA;//LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA;; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE + + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN +} + + +static void lcm_suspend(void) +{ + SET_RESET_PIN(0); + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + SET_RESET_PIN(1); + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE + + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + + MDELAY(120); // avoid LCD resume transint +} + + +LCM_DRIVER lvds_wsvga_lcm_drv = +{ + .name = "lvds_wsvga", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/baoxue_mytqt_yywi/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c b/baoxue_mytqt_yywi/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c new file mode 100644 index 0000000..9549615 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c @@ -0,0 +1,214 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE + + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN +} + + +static void lcm_suspend(void) +{ + SET_RESET_PIN(0); + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + SET_RESET_PIN(1); + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE + + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + + MDELAY(120); // avoid LCD resume transint +} + +LCM_DRIVER lvds_wsvga_ti_lcm_drv = +{ + .name = "lvds_wsvga_ti", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/baoxue_mytqt_yywi/lcm/mt65xx_lcm_list.c b/baoxue_mytqt_yywi/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..ebaff1f --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/mt65xx_lcm_list.c @@ -0,0 +1,198 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER hx8369_6575_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER nt35582_mcu_6575_lcm_drv; +extern LCM_DRIVER nt35582_rgb_6575_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_hvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_qvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER zte6516_lcm_drv; +extern LCM_DRIVER ha5266_lcm_drv; +extern LCM_DRIVER hsd070idw1_lcm_drv; +extern LCM_DRIVER lg4571_lcm_drv; +extern LCM_DRIVER lvds_wsvga_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_lcm_drv; +extern LCM_DRIVER nt35565_3d_lcm_drv; + +extern LCM_DRIVER jinchi35_hx8357c_lcm_drv; +extern LCM_DRIVER xxd35_ili9486l_lcm_drv; +extern LCM_DRIVER hc397_hx8352cn_lcm_drv; +extern LCM_DRIVER gt397_otm8009a_lcm_drv; +extern LCM_DRIVER xxd397_nt35512_lcm_drv; +extern LCM_DRIVER frd402_nt35510_lcm_drv; +extern LCM_DRIVER dh402_rm68120_lcm_drv; +extern LCM_DRIVER rixin402ips_nt35510_lcm_drv; +extern LCM_DRIVER zes588_hx8363b_lcm_drv; +extern LCM_DRIVER changxingda463_nt35510_lcm_drv; + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(HX8369_6575) + &hx8369_6575_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(NT35582_MCU_6575) + &nt35582_mcu_6575_lcm_drv, +#endif + +#if defined(NT35582_RGB_6575) + &nt35582_rgb_6575_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(HX8369_DSI_VDO) + &hx8369_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI) + &hx8369_dsi_6575_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_HVGA) + &hx8369_dsi_6575_hvga_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_QVGA) + &hx8369_dsi_6575_qvga_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(ZTE6516) + &zte6516_lcm_drv, +#endif + +#if defined(HA5266) + &ha5266_lcm_drv, +#endif + +#if defined(HSD070IDW1) + &hsd070idw1_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI) + &hx8363_6575_dsi_lcm_drv, +#endif + +#if defined(LG4571) + &lg4571_lcm_drv, +#endif + +#if defined(LVDS_WSVGA) + &lvds_wsvga_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI) + &lvds_wsvga_ti_lcm_drv, +#endif + +#if defined(NT35565_3D) + &nt35565_3d_lcm_drv, +#endif + +#if defined(JINCHI35_HX8357C) + &jinchi35_hx8357c_lcm_drv, +#endif + +#if defined(XXD35_ILI9486L) + &xxd35_ili9486l_lcm_drv, +#endif + +#if defined(HC397_HX8352CN) + &hc397_hx8352cn_lcm_drv, +#endif + +#if defined(GT397_OTM8009A) + >397_otm8009a_lcm_drv, +#endif + +#if defined(XXD397_NT35512) + &xxd397_nt35512_lcm_drv, +#endif + +#if defined(FRD402_NT35510) + &frd402_nt35510_lcm_drv, +#endif + +#if defined(DH402_RM68120) + &dh402_rm68120_lcm_drv, +#endif + +#if defined(RIXIN402IPS_NT35510) + &rixin402ips_nt35510_lcm_drv, +#endif + +#if defined(ZES588_HX8363B) + &zes588_hx8363b_lcm_drv, +#endif + +#if defined(CHANGXINGDA463_NT35510) + &changxingda463_nt35510_lcm_drv, +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); + diff --git a/baoxue_mytqt_yywi/lcm/mtk_cust.mk b/baoxue_mytqt_yywi/lcm/mtk_cust.mk new file mode 100755 index 0000000..c180615 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/mtk_cust.mk @@ -0,0 +1,3 @@ +# Used for UBOOT +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/baoxue_mytqt_yywi/lcm/nt35565_3D/nt35565_3d.c b/baoxue_mytqt_yywi/lcm/nt35565_3D/nt35565_3d.c new file mode 100644 index 0000000..0f0dac1 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/nt35565_3D/nt35565_3d.c @@ -0,0 +1,349 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x55, 1, {0x02}}, + {REGFLAG_DELAY, 1, {}}, + + {0x53, 1, {0x2C}}, + {REGFLAG_DELAY, 1, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {REGFLAG_DELAY, 1, {}}, + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x51, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + // LCM driver IC specifies 15ms needed after sleep out. But we need more delay time to make sure latest RAM data has been refreshed to screen. + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + // NT35565 accept maximum 510Mbps + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + // Work around for Novatek driver IC. If it entered ULP mode, it must be reset before resume. + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +*/ +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/baoxue_mytqt_yywi/lcm/nt35582_mcu/nt35582_mcu.c b/baoxue_mytqt_yywi/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..9482fe0 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,429 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; //note:this para is different between 6573 and 6575 + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqt_yywi/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c b/baoxue_mytqt_yywi/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c new file mode 100644 index 0000000..88689fe --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c @@ -0,0 +1,430 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->io_select_mode = 1; //note:this para is different between 6573 and 6575 + + + params->dbi.port = 0; //DBI port must be 0 or 1 on mt6575, should not be 2 + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 4; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_6575_lcm_drv = +{ + .name = "nt35582_mcu_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqt_yywi/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c b/baoxue_mytqt_yywi/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c new file mode 100644 index 0000000..b997eb6 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c @@ -0,0 +1,391 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +/* +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) +*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} + +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +}*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_div1 = 0x15; + params->dpi.mipi_pll_clk_div2 = 5; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB565; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + + params->dbi.serial.css = 2; + params->dbi.serial.csh = 2; + params->dbi.serial.rd_1st = 2; + params->dbi.serial.rd_2nd = 2; + params->dbi.serial.wr_1st = 2; + params->dbi.serial.wr_2nd = 2; + params->dbi.serial.sif_3wire = 0; + params->dbi.serial.sif_sdi = 0; + + params->dbi.serial.sif_1st_pol = 0; + params->dbi.serial.sif_sck_def = 0; + params->dbi.serial.sif_div2 = 0; + params->dbi.serial.sif_hw_cs = 1; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + params->dpi.i2x_en = 0; + params->dpi.i2x_edge = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +// config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +// config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ +// config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER nt35582_rgb_6575_lcm_drv = +{ + .name = "nt35582_rgb_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/baoxue_mytqt_yywi/lcm/r63303_idisplay/r63303_idisplay.c b/baoxue_mytqt_yywi/lcm/r63303_idisplay/r63303_idisplay.c new file mode 100644 index 0000000..70444ad --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/r63303_idisplay/r63303_idisplay.c @@ -0,0 +1,490 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (640) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB2, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB7, 4, {0x01, 0x00, 0x05, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC4, 6, {0xDF, 0x01, 0x1C, 0x0C, + 0x00, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCA, 8, {0x01, 0x80, 0x01, 0x01, + 0x7B, 0x33, 0x03, 0x03}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCB, 7, {0x00, 0x00, 0x03, 0x20, + 0x03, 0x00, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + //{0xB2, 1, {0x03}}, + //{REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 3; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active = 16; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 12; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 16; + params->dsi.horizontal_backporch = 14; + params->dsi.horizontal_frontporch = 14; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + +#define GPIO_PIN_1V8 21 +#define GPIO_PIN_5V7 19 + +extern void DSI_clk_HS_mode(bool enter); +static unsigned int is_init = false; + +static void lcm_init(void) +{ + unsigned char buffer[5]; + unsigned int data_array[16]; + + DSI_clk_HS_mode(0); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ZERO); + + mt_set_gpio_mode(GPIO_PIN_5V7, GPIO_MODE_GPIO); + mt_set_gpio_mode(GPIO_PIN_1V8, GPIO_MODE_GPIO); + SET_RESET_PIN(0); + + mt_set_gpio_dir(GPIO_PIN_5V7, GPIO_DIR_OUT); + mt_set_gpio_dir(GPIO_PIN_1V8, GPIO_DIR_OUT); + + MDELAY(100); + + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ONE); + MDELAY(100); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ONE); + MDELAY(100); + + // SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(100); + + // Enable high speed clock + DSI_clk_HS_mode(1); + MDELAY(10); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + + data_array[0] = 0x00043700; + dsi_set_cmdq(data_array, 1, 1); + read_reg_v2(0xB7, buffer, 4); + + is_init = true; + +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ZERO); + + is_init = false; +} + + +static void lcm_resume(void) +{ + if (!is_init) + lcm_init(); + + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +/* + * Notes: As for nt35512, register is 16 bits, but data is 8 bits. + * While writing, by non-nokia data format. + * While reading, by nokia data format. + * Author: chu, zewei + * Date: 2012/09/26 + */ + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +#define LCM_ID (0x5510) // reg 04h , the 2nd and 3rd parameters. +#define LCM_ID_REG (0xC500) // 0x0400 + +#define LCM_NAME "[RIXIN402IPS_NT35510]" + +#define TE_CONTROL + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + + lcm_util.send_data(data); + +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + //id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2C00); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + send_data_cmd(data); + } + } + +} + +//static unsigned int vddhh = 0x69; + +static void init_lcm_registers(void) +{ + // Rixin Guangdian 402 CMO Glass + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x01); + + //AVDD Set AVDD 5.2V + send_ctrl_cmd(0xB000); send_data_cmd(0x0D); + send_ctrl_cmd(0xB001); send_data_cmd(0x0D); + send_ctrl_cmd(0xB002); send_data_cmd(0x0D); + + //AVDD ratio + send_ctrl_cmd(0xB600); send_data_cmd(0x34); + send_ctrl_cmd(0xB601); send_data_cmd(0x34); + send_ctrl_cmd(0xB602); send_data_cmd(0x34); + + //AVEE -5.2V + send_ctrl_cmd(0xB100); send_data_cmd(0x0D); + send_ctrl_cmd(0xB101); send_data_cmd(0x0D); + send_ctrl_cmd(0xB102); send_data_cmd(0x0D); + + //AVEE ratio + send_ctrl_cmd(0xB700); send_data_cmd(0x35); + send_ctrl_cmd(0xB701); send_data_cmd(0x35); + send_ctrl_cmd(0xB702); send_data_cmd(0x35); + + //VCL -2.5V + send_ctrl_cmd(0xB200); send_data_cmd(0x00); + send_ctrl_cmd(0xB201); send_data_cmd(0x00); + send_ctrl_cmd(0xB202); send_data_cmd(0x00); + + //VCL ratio + send_ctrl_cmd(0xB800); send_data_cmd(0x24); + send_ctrl_cmd(0xB801); send_data_cmd(0x24); + send_ctrl_cmd(0xB802); send_data_cmd(0x24); + + //VGH 15V + send_ctrl_cmd(0xBF00); send_data_cmd(0x01); + send_ctrl_cmd(0xB300); send_data_cmd(0x08); + send_ctrl_cmd(0xB301); send_data_cmd(0x08); + send_ctrl_cmd(0xB302); send_data_cmd(0x08); + + //VGH ratio + send_ctrl_cmd(0xB900); send_data_cmd(0x34); + send_ctrl_cmd(0xB901); send_data_cmd(0x34); + send_ctrl_cmd(0xB902); send_data_cmd(0x34); + + //VGLX ratio + send_ctrl_cmd(0xBA00); send_data_cmd(0x24); + send_ctrl_cmd(0xBA01); send_data_cmd(0x24); + send_ctrl_cmd(0xBA02); send_data_cmd(0x24); + + //VGMP/VGSP 4.7V/0V + send_ctrl_cmd(0xBC00); send_data_cmd(0x00); + send_ctrl_cmd(0xBC01); send_data_cmd(0x88); + send_ctrl_cmd(0xBC02); send_data_cmd(0x00); + + //VGMN/VGSN -4.7V/0V + send_ctrl_cmd(0xBD00); send_data_cmd(0x00); + send_ctrl_cmd(0xBD01); send_data_cmd(0x88); + send_ctrl_cmd(0xBD02); send_data_cmd(0x00); + + //VCOM 1.525V + send_ctrl_cmd(0xBE00); send_data_cmd(0x00); + send_ctrl_cmd(0xBE01); send_data_cmd(0xA3); + + + //Gamma Setting + send_ctrl_cmd(0xD100); send_data_cmd(0x00); + send_ctrl_cmd(0xD101); send_data_cmd(0x05); + send_ctrl_cmd(0xD102); send_data_cmd(0x00); + send_ctrl_cmd(0xD103); send_data_cmd(0x40); + send_ctrl_cmd(0xD104); send_data_cmd(0x00); + send_ctrl_cmd(0xD105); send_data_cmd(0x6D); + send_ctrl_cmd(0xD106); send_data_cmd(0x00); + send_ctrl_cmd(0xD107); send_data_cmd(0x90); + send_ctrl_cmd(0xD108); send_data_cmd(0x00); + send_ctrl_cmd(0xD109); send_data_cmd(0x99); + send_ctrl_cmd(0xD10A); send_data_cmd(0x00); + send_ctrl_cmd(0xD10B); send_data_cmd(0xBB); + send_ctrl_cmd(0xD10C); send_data_cmd(0x00); + send_ctrl_cmd(0xD10D); send_data_cmd(0xDC); + send_ctrl_cmd(0xD10E); send_data_cmd(0x01); + send_ctrl_cmd(0xD10F); send_data_cmd(0x04); + send_ctrl_cmd(0xD110); send_data_cmd(0x01); + send_ctrl_cmd(0xD111); send_data_cmd(0x25); + send_ctrl_cmd(0xD112); send_data_cmd(0x01); + send_ctrl_cmd(0xD113); send_data_cmd(0x59); + send_ctrl_cmd(0xD114); send_data_cmd(0x01); + send_ctrl_cmd(0xD115); send_data_cmd(0x82); + send_ctrl_cmd(0xD116); send_data_cmd(0x01); + send_ctrl_cmd(0xD117); send_data_cmd(0xC6); + send_ctrl_cmd(0xD118); send_data_cmd(0x02); + send_ctrl_cmd(0xD119); send_data_cmd(0x01); + send_ctrl_cmd(0xD11A); send_data_cmd(0x02); + send_ctrl_cmd(0xD11B); send_data_cmd(0x02); + send_ctrl_cmd(0xD11C); send_data_cmd(0x02); + send_ctrl_cmd(0xD11D); send_data_cmd(0x39); + send_ctrl_cmd(0xD11E); send_data_cmd(0x02); + send_ctrl_cmd(0xD11F); send_data_cmd(0x79); + send_ctrl_cmd(0xD120); send_data_cmd(0x02); + send_ctrl_cmd(0xD121); send_data_cmd(0xA1); + send_ctrl_cmd(0xD122); send_data_cmd(0x02); + send_ctrl_cmd(0xD123); send_data_cmd(0xD9); + send_ctrl_cmd(0xD124); send_data_cmd(0x03); + send_ctrl_cmd(0xD125); send_data_cmd(0x00); + send_ctrl_cmd(0xD126); send_data_cmd(0x03); + send_ctrl_cmd(0xD127); send_data_cmd(0x38); + send_ctrl_cmd(0xD128); send_data_cmd(0x03); + send_ctrl_cmd(0xD129); send_data_cmd(0x67); + send_ctrl_cmd(0xD12A); send_data_cmd(0x03); + send_ctrl_cmd(0xD12B); send_data_cmd(0x8F); + send_ctrl_cmd(0xD12C); send_data_cmd(0x03); + send_ctrl_cmd(0xD12D); send_data_cmd(0xCD); + send_ctrl_cmd(0xD12E); send_data_cmd(0x03); + send_ctrl_cmd(0xD12F); send_data_cmd(0xFD); + send_ctrl_cmd(0xD130); send_data_cmd(0x03); + send_ctrl_cmd(0xD131); send_data_cmd(0xFE); + send_ctrl_cmd(0xD132); send_data_cmd(0x03); + send_ctrl_cmd(0xD133); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD200); send_data_cmd(0x00); + send_ctrl_cmd(0xD201); send_data_cmd(0x05); + send_ctrl_cmd(0xD202); send_data_cmd(0x00); + send_ctrl_cmd(0xD203); send_data_cmd(0x40); + send_ctrl_cmd(0xD204); send_data_cmd(0x00); + send_ctrl_cmd(0xD205); send_data_cmd(0x6D); + send_ctrl_cmd(0xD206); send_data_cmd(0x00); + send_ctrl_cmd(0xD207); send_data_cmd(0x90); + send_ctrl_cmd(0xD208); send_data_cmd(0x00); + send_ctrl_cmd(0xD209); send_data_cmd(0x99); + send_ctrl_cmd(0xD20A); send_data_cmd(0x00); + send_ctrl_cmd(0xD20B); send_data_cmd(0xBB); + send_ctrl_cmd(0xD20C); send_data_cmd(0x00); + send_ctrl_cmd(0xD20D); send_data_cmd(0xDC); + send_ctrl_cmd(0xD20E); send_data_cmd(0x01); + send_ctrl_cmd(0xD20F); send_data_cmd(0x04); + send_ctrl_cmd(0xD210); send_data_cmd(0x01); + send_ctrl_cmd(0xD211); send_data_cmd(0x25); + send_ctrl_cmd(0xD212); send_data_cmd(0x01); + send_ctrl_cmd(0xD213); send_data_cmd(0x59); + send_ctrl_cmd(0xD214); send_data_cmd(0x01); + send_ctrl_cmd(0xD215); send_data_cmd(0x82); + send_ctrl_cmd(0xD216); send_data_cmd(0x01); + send_ctrl_cmd(0xD217); send_data_cmd(0xC6); + send_ctrl_cmd(0xD218); send_data_cmd(0x02); + send_ctrl_cmd(0xD219); send_data_cmd(0x01); + send_ctrl_cmd(0xD21A); send_data_cmd(0x02); + send_ctrl_cmd(0xD21B); send_data_cmd(0x02); + send_ctrl_cmd(0xD21C); send_data_cmd(0x02); + send_ctrl_cmd(0xD21D); send_data_cmd(0x39); + send_ctrl_cmd(0xD21E); send_data_cmd(0x02); + send_ctrl_cmd(0xD21F); send_data_cmd(0x79); + send_ctrl_cmd(0xD220); send_data_cmd(0x02); + send_ctrl_cmd(0xD221); send_data_cmd(0xA1); + send_ctrl_cmd(0xD222); send_data_cmd(0x02); + send_ctrl_cmd(0xD223); send_data_cmd(0xD9); + send_ctrl_cmd(0xD224); send_data_cmd(0x03); + send_ctrl_cmd(0xD225); send_data_cmd(0x00); + send_ctrl_cmd(0xD226); send_data_cmd(0x03); + send_ctrl_cmd(0xD227); send_data_cmd(0x38); + send_ctrl_cmd(0xD228); send_data_cmd(0x03); + send_ctrl_cmd(0xD229); send_data_cmd(0x67); + send_ctrl_cmd(0xD22A); send_data_cmd(0x03); + send_ctrl_cmd(0xD22B); send_data_cmd(0x8F); + send_ctrl_cmd(0xD22C); send_data_cmd(0x03); + send_ctrl_cmd(0xD22D); send_data_cmd(0xCD); + send_ctrl_cmd(0xD22E); send_data_cmd(0x03); + send_ctrl_cmd(0xD22F); send_data_cmd(0xFD); + send_ctrl_cmd(0xD230); send_data_cmd(0x03); + send_ctrl_cmd(0xD231); send_data_cmd(0xFE); + send_ctrl_cmd(0xD232); send_data_cmd(0x03); + send_ctrl_cmd(0xD233); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD300); send_data_cmd(0x00); + send_ctrl_cmd(0xD301); send_data_cmd(0x05); + send_ctrl_cmd(0xD302); send_data_cmd(0x00); + send_ctrl_cmd(0xD303); send_data_cmd(0x40); + send_ctrl_cmd(0xD304); send_data_cmd(0x00); + send_ctrl_cmd(0xD305); send_data_cmd(0x6D); + send_ctrl_cmd(0xD306); send_data_cmd(0x00); + send_ctrl_cmd(0xD307); send_data_cmd(0x90); + send_ctrl_cmd(0xD308); send_data_cmd(0x00); + send_ctrl_cmd(0xD309); send_data_cmd(0x99); + send_ctrl_cmd(0xD30A); send_data_cmd(0x00); + send_ctrl_cmd(0xD30B); send_data_cmd(0xBB); + send_ctrl_cmd(0xD30C); send_data_cmd(0x00); + send_ctrl_cmd(0xD30D); send_data_cmd(0xDC); + send_ctrl_cmd(0xD30E); send_data_cmd(0x01); + send_ctrl_cmd(0xD30F); send_data_cmd(0x04); + send_ctrl_cmd(0xD310); send_data_cmd(0x01); + send_ctrl_cmd(0xD311); send_data_cmd(0x25); + send_ctrl_cmd(0xD312); send_data_cmd(0x01); + send_ctrl_cmd(0xD313); send_data_cmd(0x59); + send_ctrl_cmd(0xD314); send_data_cmd(0x01); + send_ctrl_cmd(0xD315); send_data_cmd(0x82); + send_ctrl_cmd(0xD316); send_data_cmd(0x01); + send_ctrl_cmd(0xD317); send_data_cmd(0xC6); + send_ctrl_cmd(0xD318); send_data_cmd(0x02); + send_ctrl_cmd(0xD319); send_data_cmd(0x01); + send_ctrl_cmd(0xD31A); send_data_cmd(0x02); + send_ctrl_cmd(0xD31B); send_data_cmd(0x02); + send_ctrl_cmd(0xD31C); send_data_cmd(0x02); + send_ctrl_cmd(0xD31D); send_data_cmd(0x39); + send_ctrl_cmd(0xD31E); send_data_cmd(0x02); + send_ctrl_cmd(0xD31F); send_data_cmd(0x79); + send_ctrl_cmd(0xD320); send_data_cmd(0x02); + send_ctrl_cmd(0xD321); send_data_cmd(0xA1); + send_ctrl_cmd(0xD322); send_data_cmd(0x02); + send_ctrl_cmd(0xD323); send_data_cmd(0xD9); + send_ctrl_cmd(0xD324); send_data_cmd(0x03); + send_ctrl_cmd(0xD325); send_data_cmd(0x00); + send_ctrl_cmd(0xD326); send_data_cmd(0x03); + send_ctrl_cmd(0xD327); send_data_cmd(0x38); + send_ctrl_cmd(0xD328); send_data_cmd(0x03); + send_ctrl_cmd(0xD329); send_data_cmd(0x67); + send_ctrl_cmd(0xD32A); send_data_cmd(0x03); + send_ctrl_cmd(0xD32B); send_data_cmd(0x8F); + send_ctrl_cmd(0xD32C); send_data_cmd(0x03); + send_ctrl_cmd(0xD32D); send_data_cmd(0xCD); + send_ctrl_cmd(0xD32E); send_data_cmd(0x03); + send_ctrl_cmd(0xD32F); send_data_cmd(0xFD); + send_ctrl_cmd(0xD330); send_data_cmd(0x03); + send_ctrl_cmd(0xD331); send_data_cmd(0xFE); + send_ctrl_cmd(0xD332); send_data_cmd(0x03); + send_ctrl_cmd(0xD333); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD400); send_data_cmd(0x00); + send_ctrl_cmd(0xD401); send_data_cmd(0x05); + send_ctrl_cmd(0xD402); send_data_cmd(0x00); + send_ctrl_cmd(0xD403); send_data_cmd(0x40); + send_ctrl_cmd(0xD404); send_data_cmd(0x00); + send_ctrl_cmd(0xD405); send_data_cmd(0x6D); + send_ctrl_cmd(0xD406); send_data_cmd(0x00); + send_ctrl_cmd(0xD407); send_data_cmd(0x90); + send_ctrl_cmd(0xD408); send_data_cmd(0x00); + send_ctrl_cmd(0xD409); send_data_cmd(0x99); + send_ctrl_cmd(0xD40A); send_data_cmd(0x00); + send_ctrl_cmd(0xD40B); send_data_cmd(0xBB); + send_ctrl_cmd(0xD40C); send_data_cmd(0x00); + send_ctrl_cmd(0xD40D); send_data_cmd(0xDC); + send_ctrl_cmd(0xD40E); send_data_cmd(0x01); + send_ctrl_cmd(0xD40F); send_data_cmd(0x04); + send_ctrl_cmd(0xD410); send_data_cmd(0x01); + send_ctrl_cmd(0xD411); send_data_cmd(0x25); + send_ctrl_cmd(0xD412); send_data_cmd(0x01); + send_ctrl_cmd(0xD413); send_data_cmd(0x59); + send_ctrl_cmd(0xD414); send_data_cmd(0x01); + send_ctrl_cmd(0xD415); send_data_cmd(0x82); + send_ctrl_cmd(0xD416); send_data_cmd(0x01); + send_ctrl_cmd(0xD417); send_data_cmd(0xC6); + send_ctrl_cmd(0xD418); send_data_cmd(0x02); + send_ctrl_cmd(0xD419); send_data_cmd(0x01); + send_ctrl_cmd(0xD41A); send_data_cmd(0x02); + send_ctrl_cmd(0xD41B); send_data_cmd(0x02); + send_ctrl_cmd(0xD41C); send_data_cmd(0x02); + send_ctrl_cmd(0xD41D); send_data_cmd(0x39); + send_ctrl_cmd(0xD41E); send_data_cmd(0x02); + send_ctrl_cmd(0xD41F); send_data_cmd(0x79); + send_ctrl_cmd(0xD420); send_data_cmd(0x02); + send_ctrl_cmd(0xD421); send_data_cmd(0xA1); + send_ctrl_cmd(0xD422); send_data_cmd(0x02); + send_ctrl_cmd(0xD423); send_data_cmd(0xD9); + send_ctrl_cmd(0xD424); send_data_cmd(0x03); + send_ctrl_cmd(0xD425); send_data_cmd(0x00); + send_ctrl_cmd(0xD426); send_data_cmd(0x03); + send_ctrl_cmd(0xD427); send_data_cmd(0x38); + send_ctrl_cmd(0xD428); send_data_cmd(0x03); + send_ctrl_cmd(0xD429); send_data_cmd(0x67); + send_ctrl_cmd(0xD42A); send_data_cmd(0x03); + send_ctrl_cmd(0xD42B); send_data_cmd(0x8F); + send_ctrl_cmd(0xD42C); send_data_cmd(0x03); + send_ctrl_cmd(0xD42D); send_data_cmd(0xCD); + send_ctrl_cmd(0xD42E); send_data_cmd(0x03); + send_ctrl_cmd(0xD42F); send_data_cmd(0xFD); + send_ctrl_cmd(0xD430); send_data_cmd(0x03); + send_ctrl_cmd(0xD431); send_data_cmd(0xFE); + send_ctrl_cmd(0xD432); send_data_cmd(0x03); + send_ctrl_cmd(0xD433); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD500); send_data_cmd(0x00); + send_ctrl_cmd(0xD501); send_data_cmd(0x05); + send_ctrl_cmd(0xD502); send_data_cmd(0x00); + send_ctrl_cmd(0xD503); send_data_cmd(0x40); + send_ctrl_cmd(0xD504); send_data_cmd(0x00); + send_ctrl_cmd(0xD505); send_data_cmd(0x6D); + send_ctrl_cmd(0xD506); send_data_cmd(0x00); + send_ctrl_cmd(0xD507); send_data_cmd(0x90); + send_ctrl_cmd(0xD508); send_data_cmd(0x00); + send_ctrl_cmd(0xD509); send_data_cmd(0x99); + send_ctrl_cmd(0xD50A); send_data_cmd(0x00); + send_ctrl_cmd(0xD50B); send_data_cmd(0xBB); + send_ctrl_cmd(0xD50C); send_data_cmd(0x00); + send_ctrl_cmd(0xD50D); send_data_cmd(0xDC); + send_ctrl_cmd(0xD50E); send_data_cmd(0x01); + send_ctrl_cmd(0xD50F); send_data_cmd(0x04); + send_ctrl_cmd(0xD510); send_data_cmd(0x01); + send_ctrl_cmd(0xD511); send_data_cmd(0x25); + send_ctrl_cmd(0xD512); send_data_cmd(0x01); + send_ctrl_cmd(0xD513); send_data_cmd(0x59); + send_ctrl_cmd(0xD514); send_data_cmd(0x01); + send_ctrl_cmd(0xD515); send_data_cmd(0x82); + send_ctrl_cmd(0xD516); send_data_cmd(0x01); + send_ctrl_cmd(0xD517); send_data_cmd(0xC6); + send_ctrl_cmd(0xD518); send_data_cmd(0x02); + send_ctrl_cmd(0xD519); send_data_cmd(0x01); + send_ctrl_cmd(0xD51A); send_data_cmd(0x02); + send_ctrl_cmd(0xD51B); send_data_cmd(0x02); + send_ctrl_cmd(0xD51C); send_data_cmd(0x02); + send_ctrl_cmd(0xD51D); send_data_cmd(0x39); + send_ctrl_cmd(0xD51E); send_data_cmd(0x02); + send_ctrl_cmd(0xD51F); send_data_cmd(0x79); + send_ctrl_cmd(0xD520); send_data_cmd(0x02); + send_ctrl_cmd(0xD521); send_data_cmd(0xA1); + send_ctrl_cmd(0xD522); send_data_cmd(0x02); + send_ctrl_cmd(0xD523); send_data_cmd(0xD9); + send_ctrl_cmd(0xD524); send_data_cmd(0x03); + send_ctrl_cmd(0xD525); send_data_cmd(0x00); + send_ctrl_cmd(0xD526); send_data_cmd(0x03); + send_ctrl_cmd(0xD527); send_data_cmd(0x38); + send_ctrl_cmd(0xD528); send_data_cmd(0x03); + send_ctrl_cmd(0xD529); send_data_cmd(0x67); + send_ctrl_cmd(0xD52A); send_data_cmd(0x03); + send_ctrl_cmd(0xD52B); send_data_cmd(0x8F); + send_ctrl_cmd(0xD52C); send_data_cmd(0x03); + send_ctrl_cmd(0xD52D); send_data_cmd(0xCD); + send_ctrl_cmd(0xD52E); send_data_cmd(0x03); + send_ctrl_cmd(0xD52F); send_data_cmd(0xFD); + send_ctrl_cmd(0xD530); send_data_cmd(0x03); + send_ctrl_cmd(0xD531); send_data_cmd(0xFE); + send_ctrl_cmd(0xD532); send_data_cmd(0x03); + send_ctrl_cmd(0xD533); send_data_cmd(0xFF); + + send_ctrl_cmd(0xD600); send_data_cmd(0x00); + send_ctrl_cmd(0xD601); send_data_cmd(0x05); + send_ctrl_cmd(0xD602); send_data_cmd(0x00); + send_ctrl_cmd(0xD603); send_data_cmd(0x40); + send_ctrl_cmd(0xD604); send_data_cmd(0x00); + send_ctrl_cmd(0xD605); send_data_cmd(0x6D); + send_ctrl_cmd(0xD606); send_data_cmd(0x00); + send_ctrl_cmd(0xD607); send_data_cmd(0x90); + send_ctrl_cmd(0xD608); send_data_cmd(0x00); + send_ctrl_cmd(0xD609); send_data_cmd(0x99); + send_ctrl_cmd(0xD60A); send_data_cmd(0x00); + send_ctrl_cmd(0xD60B); send_data_cmd(0xBB); + send_ctrl_cmd(0xD60C); send_data_cmd(0x00); + send_ctrl_cmd(0xD60D); send_data_cmd(0xDC); + send_ctrl_cmd(0xD60E); send_data_cmd(0x01); + send_ctrl_cmd(0xD60F); send_data_cmd(0x04); + send_ctrl_cmd(0xD610); send_data_cmd(0x01); + send_ctrl_cmd(0xD611); send_data_cmd(0x25); + send_ctrl_cmd(0xD612); send_data_cmd(0x01); + send_ctrl_cmd(0xD613); send_data_cmd(0x59); + send_ctrl_cmd(0xD614); send_data_cmd(0x01); + send_ctrl_cmd(0xD615); send_data_cmd(0x82); + send_ctrl_cmd(0xD616); send_data_cmd(0x01); + send_ctrl_cmd(0xD617); send_data_cmd(0xC6); + send_ctrl_cmd(0xD618); send_data_cmd(0x02); + send_ctrl_cmd(0xD619); send_data_cmd(0x01); + send_ctrl_cmd(0xD61A); send_data_cmd(0x02); + send_ctrl_cmd(0xD61B); send_data_cmd(0x02); + send_ctrl_cmd(0xD61C); send_data_cmd(0x02); + send_ctrl_cmd(0xD61D); send_data_cmd(0x39); + send_ctrl_cmd(0xD61E); send_data_cmd(0x02); + send_ctrl_cmd(0xD61F); send_data_cmd(0x79); + send_ctrl_cmd(0xD620); send_data_cmd(0x02); + send_ctrl_cmd(0xD621); send_data_cmd(0xA1); + send_ctrl_cmd(0xD622); send_data_cmd(0x02); + send_ctrl_cmd(0xD623); send_data_cmd(0xD9); + send_ctrl_cmd(0xD624); send_data_cmd(0x03); + send_ctrl_cmd(0xD625); send_data_cmd(0x00); + send_ctrl_cmd(0xD626); send_data_cmd(0x03); + send_ctrl_cmd(0xD627); send_data_cmd(0x38); + send_ctrl_cmd(0xD628); send_data_cmd(0x03); + send_ctrl_cmd(0xD629); send_data_cmd(0x67); + send_ctrl_cmd(0xD62A); send_data_cmd(0x03); + send_ctrl_cmd(0xD62B); send_data_cmd(0x8F); + send_ctrl_cmd(0xD62C); send_data_cmd(0x03); + send_ctrl_cmd(0xD62D); send_data_cmd(0xCD); + send_ctrl_cmd(0xD62E); send_data_cmd(0x03); + send_ctrl_cmd(0xD62F); send_data_cmd(0xFD); + send_ctrl_cmd(0xD630); send_data_cmd(0x03); + send_ctrl_cmd(0xD631); send_data_cmd(0xFE); + send_ctrl_cmd(0xD632); send_data_cmd(0x03); + send_ctrl_cmd(0xD633); send_data_cmd(0xFF); + + //LV2 Page 0 enable + send_ctrl_cmd(0xF000); send_data_cmd(0x55); + send_ctrl_cmd(0xF001); send_data_cmd(0xAA); + send_ctrl_cmd(0xF002); send_data_cmd(0x52); + send_ctrl_cmd(0xF003); send_data_cmd(0x08); + send_ctrl_cmd(0xF004); send_data_cmd(0x00); + + //Display control + send_ctrl_cmd(0xB100); send_data_cmd(0xFC); + send_ctrl_cmd(0xB101); send_data_cmd(0x00); + + //480x854 + send_ctrl_cmd(0xB500); send_data_cmd(0x6B); + + //Source hold time + send_ctrl_cmd(0xB600); send_data_cmd(0x05); + + //Gate EQ control + send_ctrl_cmd(0xB700); send_data_cmd(0x70); + send_ctrl_cmd(0xB701); send_data_cmd(0x70); + + //Source EQ control (Mode 2) + send_ctrl_cmd(0xB800); send_data_cmd(0x01); + send_ctrl_cmd(0xB801); send_data_cmd(0x05); + send_ctrl_cmd(0xB802); send_data_cmd(0x05); + send_ctrl_cmd(0xB803); send_data_cmd(0x05); + + //Inversion mode (Column) + send_ctrl_cmd(0xBC00); send_data_cmd(0x00); + send_ctrl_cmd(0xBC01); send_data_cmd(0x00); + send_ctrl_cmd(0xBC02); send_data_cmd(0x00); + + //Timing control 8phase dual side/4H/4Delayms/RST_EN + send_ctrl_cmd(0xC900); send_data_cmd(0xD0); + send_ctrl_cmd(0xC901); send_data_cmd(0x82); + send_ctrl_cmd(0xC902); send_data_cmd(0x50); + send_ctrl_cmd(0xC903); send_data_cmd(0x50); + send_ctrl_cmd(0xC904); send_data_cmd(0x50); + +#ifdef TE_CONTROL + send_ctrl_cmd(0x3500); send_data_cmd(0x00);//ADD TE ON +// send_ctrl_cmd(0x4400); send_data_cmd(0x01);//ADD +// send_ctrl_cmd(0x4401); send_data_cmd(0x90);//ADD +#endif + + send_ctrl_cmd(0x3600); send_data_cmd(0xC0); // 0xC0 + send_ctrl_cmd(0x3A00); send_data_cmd(0x55); + + //send_ctrl_cmd(0x2100); send_data_cmd(0x00); + send_ctrl_cmd(0x2A00);send_data_cmd(0x00); + send_ctrl_cmd(0x2A01);send_data_cmd(0x00); + send_ctrl_cmd(0x2A02);send_data_cmd(HIGH_BYTE(FRAME_WIDTH)); + send_ctrl_cmd(0x2A03);send_data_cmd(LOW_BYTE(FRAME_WIDTH)); + send_ctrl_cmd(0x2B00);send_data_cmd(0x00); + send_ctrl_cmd(0x2B01);send_data_cmd(0x00); + send_ctrl_cmd(0x2B02);send_data_cmd(HIGH_BYTE(FRAME_HEIGHT)); + send_ctrl_cmd(0x2B03);send_data_cmd(LOW_BYTE(FRAME_HEIGHT)); + send_ctrl_cmd(0x2C00); + MDELAY(50); + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; + */ + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects bus composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects bus composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; // 2; + params->dbi.parallel.write_hold = 3; // 3; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; // 6; //6; + + params->dbi.parallel.read_setup = 2; // 2; // 4; // 3; + params->dbi.parallel.read_hold = 3; // 3; + params->dbi.parallel.read_latency = 18; // 18; + + params->dbi.parallel.wait_period = 1; // 2; // 2; + params->dbi.parallel.cs_high_width = 0; // 1; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + #ifdef TE_CONTROL + // enable tearing-free + /* + if (LCM_DBI_TE_MODE_DISABLED == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_Enable(FALSE)); + return; + } + + if (LCM_DBI_TE_MODE_VSYNC_ONLY == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY)); + } else if (LCM_DBI_TE_MODE_VSYNC_OR_HSYNC == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_OR_HSYNC)); + LCD_CHECK_RET(LCD_TE_ConfigVHSyncMode(dbi->te_hs_delay_cnt, + dbi->te_vs_width_cnt, + (LCD_TE_VS_WIDTH_CNT_DIV)dbi->te_vs_width_cnt_div)); + } else ASSERT(0); + + LCD_CHECK_RET(LCD_TE_SetEdgePolarity(dbi->te_edge_polarity)); + LCD_CHECK_RET(LCD_TE_Enable(TRUE)); + */ + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; //LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING; + + /* + * Notes: The body of the function LCD_TE_ConfigVHSyncMode() is void! + */ + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + #else + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + #endif +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(50); + send_ctrl_cmd(0x1000); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + #if 1 + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(100); // 400 + + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x01); + UDELAY(10); + + lcd_id = get_lcd_id_r(LCM_ID_REG) & 0xFF; + lcd_id = (lcd_id << 8) | (get_lcd_id_r(LCM_ID_REG + 1) & 0xFF); + + LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2c00); + + //lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT(LCM_NAME"get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT(LCM_NAME"get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqt_yywi/lcm/spfd5461a/spfd5461a.c b/baoxue_mytqt_yywi/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..fef627b --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,385 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqt_yywi/lcm/ta7601/ta7601.c b/baoxue_mytqt_yywi/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..46ac606 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/ta7601/ta7601.c @@ -0,0 +1,318 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/baoxue_mytqt_yywi/lcm/tft1p3037/tft1p3037.c b/baoxue_mytqt_yywi/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..15ced13 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,349 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/baoxue_mytqt_yywi/lcm/xxd35_ili9486l/xxd35_ili9486l.c b/baoxue_mytqt_yywi/lcm/xxd35_ili9486l/xxd35_ili9486l.c new file mode 100644 index 0000000..5fe2584 --- /dev/null +++ b/baoxue_mytqt_yywi/lcm/xxd35_ili9486l/xxd35_ili9486l.c @@ -0,0 +1,474 @@ +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define LCMID_REG (0xd3) +#define LCM_ID (0x9486) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + send_ctrl_cmd(0x2C); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + } + } +} + +//unsigned int vcomadj = 0x00; +static void init_lcm_registers(void) +{ + // xingxunda 3.5 ili9486l on 2012/09/24 + send_ctrl_cmd(0x01); + MDELAY(30); + + send_ctrl_cmd(0xF2); + send_data_cmd(0x18); + send_data_cmd(0xA3); + send_data_cmd(0x12); + send_data_cmd(0x02); + send_data_cmd(0xB2); + send_data_cmd(0x12); + send_data_cmd(0xFF); + send_data_cmd(0x10); + send_data_cmd(0x00); + + send_ctrl_cmd(0xF8); + send_data_cmd(0x21); + send_data_cmd(0x04); + + /*send_ctrl_cmd(0xF9); + send_data_cmd(0x00); + send_data_cmd(0x08); */ + + send_ctrl_cmd(0x36); + send_data_cmd(0x08); // 0x08 + + send_ctrl_cmd(0x3A); + send_data_cmd(0x55); + + send_ctrl_cmd(0xB4); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); + send_data_cmd(0x02); + send_data_cmd(0x22); + + send_ctrl_cmd(0xC1); + send_data_cmd(0x41); + + + send_ctrl_cmd(0xC5); // VCOM + send_data_cmd(0x00); + send_data_cmd(0x08); + //vcomadj+=1; + + send_ctrl_cmd(0xE0); + send_data_cmd(0x0F); + send_data_cmd(0x1F); + send_data_cmd(0x1C); + send_data_cmd(0x0C); + send_data_cmd(0x0F); + send_data_cmd(0x08); + send_data_cmd(0x48); + send_data_cmd(0x98); + send_data_cmd(0x37); + send_data_cmd(0x0A); + send_data_cmd(0x13); + send_data_cmd(0x04); + send_data_cmd(0x11); + send_data_cmd(0x0D); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE1); + send_data_cmd(0x0F); + send_data_cmd(0x32); + send_data_cmd(0x2E); + send_data_cmd(0x0B); + send_data_cmd(0x0D); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x75); + send_data_cmd(0x37); + send_data_cmd(0x06); + send_data_cmd(0x10); + send_data_cmd(0x03); + send_data_cmd(0x24); + send_data_cmd(0x20); + send_data_cmd(0x00); + + send_ctrl_cmd(0x2A); //Set_column_address + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x3F); + //Set_page_address + send_ctrl_cmd(0x2B); //Set_page_address + send_data_cmd(0x00); + send_data_cmd(0x00);//00 + send_data_cmd(0x01); + send_data_cmd(0xDF);//8f + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(50); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects buss composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects buss composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; // 2; + params->dbi.parallel.write_hold = 1; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; //6; + + params->dbi.parallel.read_setup = 3; // 3; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + //params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + //unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + + // Advises that should hold high level for about 120 ms as for HX... series lcd ic + MDELAY(120); + //MDELAY(50); + + //lcd_id = get_lcd_id_n(LCMID_REG, 2); + //LCD_PRINT("[XXD35_ILI9486L]lcm_init: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); + + #if 0 + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal MDELAY scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); + #endif +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + MDELAY(50); + send_ctrl_cmd(0x10); + MDELAY(120); +} + +static void lcm_resume(void) +{ + #if 0 + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(20); + + lcd_id = get_lcd_id_n(LCMID_REG, 3) & 0xFF; + lcd_id = (lcd_id << 8) | (get_lcd_id_n(LCMID_REG, 4) & 0xFF); + LCD_PRINT("[XXD35_ILI9486L]lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + //id = (id << 8) | (read_data_cmd() & 0xFF); + + LCD_PRINT("[XXD35_ILI9486L]get_lcd_id_r: id = 0x%x\n", id); + + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + UDELAY(10); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT("[XXD35_ILI9486L]get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + // Tearing effect + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ + unsigned int pwm_clk = 23706 / (1< +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +/* + * Notes: As for nt35512, register is 16 bits, but data is 8 bits. + * While writing, by non-nokia data format. + * While reading, by nokia data format. + * Author: chu, zewei + * Date: 2012/09/26 + */ + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID (0x5510) // reg 04h , the 2nd and 3rd parameters. +#define LCM_ID_REG (0xC500) // 0x0400 + +#define LCM_NAME "[XXD397_NT35512]" + +//#define TE_CONTROL + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + + lcm_util.send_data(data); + +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + //id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2C00); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + } + } + +} + +//static unsigned int vddhh = 0x69; + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x01); + + // AVDD: manual) + send_ctrl_cmd(0xB000);send_data_cmd(0x0D); + send_ctrl_cmd(0xB001);send_data_cmd(0x0D); + send_ctrl_cmd(0xB002);send_data_cmd(0x0D); + + send_ctrl_cmd(0xB600);send_data_cmd(0x34); + send_ctrl_cmd(0xB601);send_data_cmd(0x34); + send_ctrl_cmd(0xB602);send_data_cmd(0x34); + + // AVEE: manual) + send_ctrl_cmd(0xB100);send_data_cmd(0x0D); + send_ctrl_cmd(0xB101);send_data_cmd(0x0D); + send_ctrl_cmd(0xB102);send_data_cmd(0x0D); + + send_ctrl_cmd(0xB700);send_data_cmd(0x34); + send_ctrl_cmd(0xB701);send_data_cmd(0x34); + send_ctrl_cmd(0xB702);send_data_cmd(0x34); + + send_ctrl_cmd(0xB200);send_data_cmd(0x00); + send_ctrl_cmd(0xB201);send_data_cmd(0x00); + send_ctrl_cmd(0xB202);send_data_cmd(0x00); + + //Power Control for VCL + send_ctrl_cmd(0xB800);send_data_cmd(0x24); + send_ctrl_cmd(0xB800);send_data_cmd(0x24); + send_ctrl_cmd(0xB800);send_data_cmd(0x24); + + // VGH: + send_ctrl_cmd(0xBF00);send_data_cmd(0x01); + + send_ctrl_cmd(0xB300);send_data_cmd(0x0F); + send_ctrl_cmd(0xB301);send_data_cmd(0x0F); + send_ctrl_cmd(0xB302);send_data_cmd(0x0F); + + send_ctrl_cmd(0xB900);send_data_cmd(0x34); + send_ctrl_cmd(0xB901);send_data_cmd(0x34); + send_ctrl_cmd(0xB902);send_data_cmd(0x34); + + // VGL_REG(VGLO) + send_ctrl_cmd(0xB500);send_data_cmd(0x08); + send_ctrl_cmd(0xB501);send_data_cmd(0x08); + send_ctrl_cmd(0xB502);send_data_cmd(0x08); + send_ctrl_cmd(0xC200);send_data_cmd(0x03); + + // VGL(LVGL) + send_ctrl_cmd(0xBA00);send_data_cmd(0x24); + send_ctrl_cmd(0xBA01);send_data_cmd(0x24); + send_ctrl_cmd(0xBA02);send_data_cmd(0x24); + + + // VGMP/VGSP + send_ctrl_cmd(0xBC00);send_data_cmd(0X00); // 02 + send_ctrl_cmd(0xBC01);send_data_cmd(0x78); // 02 + send_ctrl_cmd(0xBC02);send_data_cmd(0X00); //02 + + + //VGMN/VGSN + send_ctrl_cmd(0xBD00);send_data_cmd(0x00); + send_ctrl_cmd(0xBD01);send_data_cmd(0x78); + send_ctrl_cmd(0xBD02);send_data_cmd(0x00); + // VCOM= + + send_ctrl_cmd(0xBE00);send_data_cmd(0x00); + send_ctrl_cmd(0xBE01);send_data_cmd(0x63);//flicker 0x69 + //vddhh -= 0x02; + + //R+ + send_ctrl_cmd(0xD100);send_data_cmd(0x00); + send_ctrl_cmd(0xD101);send_data_cmd(0x2D); + send_ctrl_cmd(0xD102);send_data_cmd(0x00); + send_ctrl_cmd(0xD103);send_data_cmd(0x2E); + send_ctrl_cmd(0xD104);send_data_cmd(0x00); + send_ctrl_cmd(0xD105);send_data_cmd(0x32); + send_ctrl_cmd(0xD106);send_data_cmd(0x00); + send_ctrl_cmd(0xD107);send_data_cmd(0x44); + send_ctrl_cmd(0xD108);send_data_cmd(0x00); + send_ctrl_cmd(0xD109);send_data_cmd(0x53); + send_ctrl_cmd(0xD10A);send_data_cmd(0x00); + send_ctrl_cmd(0xD10B);send_data_cmd(0x88); + send_ctrl_cmd(0xD10C);send_data_cmd(0x00); + send_ctrl_cmd(0xD10D);send_data_cmd(0xB6); + send_ctrl_cmd(0xD10E);send_data_cmd(0x00); + send_ctrl_cmd(0xD10F);send_data_cmd(0xF3); + send_ctrl_cmd(0xD110);send_data_cmd(0x01); + send_ctrl_cmd(0xD111);send_data_cmd(0x22); + send_ctrl_cmd(0xD112);send_data_cmd(0x01); + send_ctrl_cmd(0xD113);send_data_cmd(0x64); + send_ctrl_cmd(0xD114);send_data_cmd(0x01); + send_ctrl_cmd(0xD115);send_data_cmd(0x92); + send_ctrl_cmd(0xD116);send_data_cmd(0x01); + send_ctrl_cmd(0xD117);send_data_cmd(0xD4); + send_ctrl_cmd(0xD118);send_data_cmd(0x02); + send_ctrl_cmd(0xD119);send_data_cmd(0x07); + send_ctrl_cmd(0xD11A);send_data_cmd(0x02); + send_ctrl_cmd(0xD11B);send_data_cmd(0x08); + send_ctrl_cmd(0xD11C);send_data_cmd(0x02); + send_ctrl_cmd(0xD11D);send_data_cmd(0x34); + send_ctrl_cmd(0xD11E);send_data_cmd(0x02); + send_ctrl_cmd(0xD11F);send_data_cmd(0x5F); + send_ctrl_cmd(0xD120);send_data_cmd(0x02); + send_ctrl_cmd(0xD121);send_data_cmd(0x78); + send_ctrl_cmd(0xD122);send_data_cmd(0x02); + send_ctrl_cmd(0xD123);send_data_cmd(0x94); + send_ctrl_cmd(0xD124);send_data_cmd(0x02); + send_ctrl_cmd(0xD125);send_data_cmd(0xA6); + send_ctrl_cmd(0xD126);send_data_cmd(0x02); + send_ctrl_cmd(0xD127);send_data_cmd(0xBB); + send_ctrl_cmd(0xD128);send_data_cmd(0x02); + send_ctrl_cmd(0xD129);send_data_cmd(0xCA); + send_ctrl_cmd(0xD12A);send_data_cmd(0x02); + send_ctrl_cmd(0xD12B);send_data_cmd(0xDB); + send_ctrl_cmd(0xD12C);send_data_cmd(0x02); + send_ctrl_cmd(0xD12D);send_data_cmd(0xe8); + send_ctrl_cmd(0xD12E);send_data_cmd(0x02); + send_ctrl_cmd(0xD12F);send_data_cmd(0xF9); + send_ctrl_cmd(0xD130);send_data_cmd(0x03); + send_ctrl_cmd(0xD131);send_data_cmd(0x1F); + send_ctrl_cmd(0xD132);send_data_cmd(0x03); + send_ctrl_cmd(0xD133);send_data_cmd(0x7F); + //G+ + send_ctrl_cmd(0xD200);send_data_cmd(0x00); + send_ctrl_cmd(0xD201);send_data_cmd(0x2D); + send_ctrl_cmd(0xD202);send_data_cmd(0x00); + send_ctrl_cmd(0xD203);send_data_cmd(0x2E); + send_ctrl_cmd(0xD204);send_data_cmd(0x00); + send_ctrl_cmd(0xD205);send_data_cmd(0x32); + send_ctrl_cmd(0xD206);send_data_cmd(0x00); + send_ctrl_cmd(0xD207);send_data_cmd(0x44); + send_ctrl_cmd(0xD208);send_data_cmd(0x00); + send_ctrl_cmd(0xD209);send_data_cmd(0x53); + send_ctrl_cmd(0xD20A);send_data_cmd(0x00); + send_ctrl_cmd(0xD20B);send_data_cmd(0x88); + send_ctrl_cmd(0xD20C);send_data_cmd(0x00); + send_ctrl_cmd(0xD20D);send_data_cmd(0xB6); + send_ctrl_cmd(0xD20E);send_data_cmd(0x00); + send_ctrl_cmd(0xD20F);send_data_cmd(0xF3); + send_ctrl_cmd(0xD210);send_data_cmd(0x01); + send_ctrl_cmd(0xD211);send_data_cmd(0x22); + send_ctrl_cmd(0xD212);send_data_cmd(0x01); + send_ctrl_cmd(0xD213);send_data_cmd(0x64); + send_ctrl_cmd(0xD214);send_data_cmd(0x01); + send_ctrl_cmd(0xD215);send_data_cmd(0x92); + send_ctrl_cmd(0xD216);send_data_cmd(0x01); + send_ctrl_cmd(0xD217);send_data_cmd(0xD4); + send_ctrl_cmd(0xD218);send_data_cmd(0x02); + send_ctrl_cmd(0xD219);send_data_cmd(0x07); + send_ctrl_cmd(0xD21A);send_data_cmd(0x02); + send_ctrl_cmd(0xD21B);send_data_cmd(0x08); + send_ctrl_cmd(0xD21C);send_data_cmd(0x02); + send_ctrl_cmd(0xD21D);send_data_cmd(0x34); + send_ctrl_cmd(0xD21E);send_data_cmd(0x02); + send_ctrl_cmd(0xD21F);send_data_cmd(0x5F); + send_ctrl_cmd(0xD220);send_data_cmd(0x02); + send_ctrl_cmd(0xD221);send_data_cmd(0x78); + send_ctrl_cmd(0xD222);send_data_cmd(0x02); + send_ctrl_cmd(0xD223);send_data_cmd(0x94); + send_ctrl_cmd(0xD224);send_data_cmd(0x02); + send_ctrl_cmd(0xD225);send_data_cmd(0xA6); + send_ctrl_cmd(0xD226);send_data_cmd(0x02); + send_ctrl_cmd(0xD227);send_data_cmd(0xBB); + send_ctrl_cmd(0xD228);send_data_cmd(0x02); + send_ctrl_cmd(0xD229);send_data_cmd(0xCA); + send_ctrl_cmd(0xD22A);send_data_cmd(0x02); + send_ctrl_cmd(0xD22B);send_data_cmd(0xDB); + send_ctrl_cmd(0xD22C);send_data_cmd(0x02); + send_ctrl_cmd(0xD22D);send_data_cmd(0xe8); + send_ctrl_cmd(0xD22E);send_data_cmd(0x02); + send_ctrl_cmd(0xD22F);send_data_cmd(0xF9); + send_ctrl_cmd(0xD230);send_data_cmd(0x03); + send_ctrl_cmd(0xD231);send_data_cmd(0x1F); + send_ctrl_cmd(0xD232);send_data_cmd(0x03); + send_ctrl_cmd(0xD233);send_data_cmd(0x7F); + //B+ + send_ctrl_cmd(0xD300);send_data_cmd(0x00); + send_ctrl_cmd(0xD301);send_data_cmd(0x2D); + send_ctrl_cmd(0xD302);send_data_cmd(0x00); + send_ctrl_cmd(0xD303);send_data_cmd(0x2E); + send_ctrl_cmd(0xD304);send_data_cmd(0x00); + send_ctrl_cmd(0xD305);send_data_cmd(0x32); + send_ctrl_cmd(0xD306);send_data_cmd(0x00); + send_ctrl_cmd(0xD307);send_data_cmd(0x44); + send_ctrl_cmd(0xD308);send_data_cmd(0x00); + send_ctrl_cmd(0xD309);send_data_cmd(0x53); + send_ctrl_cmd(0xD30A);send_data_cmd(0x00); + send_ctrl_cmd(0xD30B);send_data_cmd(0x88); + send_ctrl_cmd(0xD30C);send_data_cmd(0x00); + send_ctrl_cmd(0xD30D);send_data_cmd(0xB6); + send_ctrl_cmd(0xD30E);send_data_cmd(0x00); + send_ctrl_cmd(0xD30F);send_data_cmd(0xF3); + send_ctrl_cmd(0xD310);send_data_cmd(0x01); + send_ctrl_cmd(0xD311);send_data_cmd(0x22); + send_ctrl_cmd(0xD312);send_data_cmd(0x01); + send_ctrl_cmd(0xD313);send_data_cmd(0x64); + send_ctrl_cmd(0xD314);send_data_cmd(0x01); + send_ctrl_cmd(0xD315);send_data_cmd(0x92); + send_ctrl_cmd(0xD316);send_data_cmd(0x01); + send_ctrl_cmd(0xD317);send_data_cmd(0xD4); + send_ctrl_cmd(0xD318);send_data_cmd(0x02); + send_ctrl_cmd(0xD319);send_data_cmd(0x07); + send_ctrl_cmd(0xD31A);send_data_cmd(0x02); + send_ctrl_cmd(0xD31B);send_data_cmd(0x08); + send_ctrl_cmd(0xD31C);send_data_cmd(0x02); + send_ctrl_cmd(0xD31D);send_data_cmd(0x34); + send_ctrl_cmd(0xD31E);send_data_cmd(0x02); + send_ctrl_cmd(0xD31F);send_data_cmd(0x5F); + send_ctrl_cmd(0xD320);send_data_cmd(0x02); + send_ctrl_cmd(0xD321);send_data_cmd(0x78); + send_ctrl_cmd(0xD322);send_data_cmd(0x02); + send_ctrl_cmd(0xD323);send_data_cmd(0x94); + send_ctrl_cmd(0xD324);send_data_cmd(0x02); + send_ctrl_cmd(0xD325);send_data_cmd(0xA6); + send_ctrl_cmd(0xD326);send_data_cmd(0x02); + send_ctrl_cmd(0xD327);send_data_cmd(0xBB); + send_ctrl_cmd(0xD328);send_data_cmd(0x02); + send_ctrl_cmd(0xD329);send_data_cmd(0xCA); + send_ctrl_cmd(0xD32A);send_data_cmd(0x02); + send_ctrl_cmd(0xD32B);send_data_cmd(0xDB); + send_ctrl_cmd(0xD32C);send_data_cmd(0x02); + send_ctrl_cmd(0xD32D);send_data_cmd(0xe8); + send_ctrl_cmd(0xD32E);send_data_cmd(0x02); + send_ctrl_cmd(0xD32F);send_data_cmd(0xF9); + send_ctrl_cmd(0xD330);send_data_cmd(0x03); + send_ctrl_cmd(0xD331);send_data_cmd(0x1F); + send_ctrl_cmd(0xD332);send_data_cmd(0x03); + send_ctrl_cmd(0xD333);send_data_cmd(0x7F); + //RREGW + send_ctrl_cmd(0xD400);send_data_cmd(0x00); + send_ctrl_cmd(0xD401);send_data_cmd(0x2D); + send_ctrl_cmd(0xD402);send_data_cmd(0x00); + send_ctrl_cmd(0xD403);send_data_cmd(0x2E); + send_ctrl_cmd(0xD404);send_data_cmd(0x00); + send_ctrl_cmd(0xD405);send_data_cmd(0x32); + send_ctrl_cmd(0xD406);send_data_cmd(0x00); + send_ctrl_cmd(0xD407);send_data_cmd(0x44); + send_ctrl_cmd(0xD408);send_data_cmd(0x00); + send_ctrl_cmd(0xD409);send_data_cmd(0x53); + send_ctrl_cmd(0xD40A);send_data_cmd(0x00); + send_ctrl_cmd(0xD40B);send_data_cmd(0x88); + send_ctrl_cmd(0xD40C);send_data_cmd(0x00); + send_ctrl_cmd(0xD40D);send_data_cmd(0xB6); + send_ctrl_cmd(0xD40E);send_data_cmd(0x00); + send_ctrl_cmd(0xD40F);send_data_cmd(0xF3); + send_ctrl_cmd(0xD410);send_data_cmd(0x01); + send_ctrl_cmd(0xD411);send_data_cmd(0x22); + send_ctrl_cmd(0xD412);send_data_cmd(0x01); + send_ctrl_cmd(0xD413);send_data_cmd(0x64); + send_ctrl_cmd(0xD414);send_data_cmd(0x01); + send_ctrl_cmd(0xD415);send_data_cmd(0x92); + send_ctrl_cmd(0xD416);send_data_cmd(0x01); + send_ctrl_cmd(0xD417);send_data_cmd(0xD4); + send_ctrl_cmd(0xD418);send_data_cmd(0x02); + send_ctrl_cmd(0xD419);send_data_cmd(0x07); + send_ctrl_cmd(0xD41A);send_data_cmd(0x02); + send_ctrl_cmd(0xD41B);send_data_cmd(0x08); + send_ctrl_cmd(0xD41C);send_data_cmd(0x02); + send_ctrl_cmd(0xD41D);send_data_cmd(0x34); + send_ctrl_cmd(0xD41E);send_data_cmd(0x02); + send_ctrl_cmd(0xD41F);send_data_cmd(0x5F); + send_ctrl_cmd(0xD420);send_data_cmd(0x02); + send_ctrl_cmd(0xD421);send_data_cmd(0x78); + send_ctrl_cmd(0xD422);send_data_cmd(0x02); + send_ctrl_cmd(0xD423);send_data_cmd(0x94); + send_ctrl_cmd(0xD424);send_data_cmd(0x02); + send_ctrl_cmd(0xD425);send_data_cmd(0xA6); + send_ctrl_cmd(0xD426);send_data_cmd(0x02); + send_ctrl_cmd(0xD427);send_data_cmd(0xBB); + send_ctrl_cmd(0xD428);send_data_cmd(0x02); + send_ctrl_cmd(0xD429);send_data_cmd(0xCA); + send_ctrl_cmd(0xD42A);send_data_cmd(0x02); + send_ctrl_cmd(0xD42B);send_data_cmd(0xDB); + send_ctrl_cmd(0xD42C);send_data_cmd(0x02); + send_ctrl_cmd(0xD42D);send_data_cmd(0xe8); + send_ctrl_cmd(0xD42E);send_data_cmd(0x02); + send_ctrl_cmd(0xD42F);send_data_cmd(0xF9); + send_ctrl_cmd(0xD430);send_data_cmd(0x03); + send_ctrl_cmd(0xD431);send_data_cmd(0x1F); + send_ctrl_cmd(0xD432);send_data_cmd(0x03); + send_ctrl_cmd(0xD433);send_data_cmd(0x7F); + //GREGW + send_ctrl_cmd(0xD500);send_data_cmd(0x00); + send_ctrl_cmd(0xD501);send_data_cmd(0x2D); + send_ctrl_cmd(0xD502);send_data_cmd(0x00); + send_ctrl_cmd(0xD503);send_data_cmd(0x2E); + send_ctrl_cmd(0xD504);send_data_cmd(0x00); + send_ctrl_cmd(0xD505);send_data_cmd(0x32); + send_ctrl_cmd(0xD506);send_data_cmd(0x00); + send_ctrl_cmd(0xD507);send_data_cmd(0x44); + send_ctrl_cmd(0xD508);send_data_cmd(0x00); + send_ctrl_cmd(0xD509);send_data_cmd(0x53); + send_ctrl_cmd(0xD50A);send_data_cmd(0x00); + send_ctrl_cmd(0xD50B);send_data_cmd(0x88); + send_ctrl_cmd(0xD50C);send_data_cmd(0x00); + send_ctrl_cmd(0xD50D);send_data_cmd(0xB6); + send_ctrl_cmd(0xD50E);send_data_cmd(0x00); + send_ctrl_cmd(0xD50F);send_data_cmd(0xF3); + send_ctrl_cmd(0xD510);send_data_cmd(0x01); + send_ctrl_cmd(0xD511);send_data_cmd(0x22); + send_ctrl_cmd(0xD512);send_data_cmd(0x01); + send_ctrl_cmd(0xD513);send_data_cmd(0x64); + send_ctrl_cmd(0xD514);send_data_cmd(0x01); + send_ctrl_cmd(0xD515);send_data_cmd(0x92); + send_ctrl_cmd(0xD516);send_data_cmd(0x01); + send_ctrl_cmd(0xD517);send_data_cmd(0xD5); + send_ctrl_cmd(0xD518);send_data_cmd(0x02); + send_ctrl_cmd(0xD519);send_data_cmd(0x07); + send_ctrl_cmd(0xD51A);send_data_cmd(0x02); + send_ctrl_cmd(0xD51B);send_data_cmd(0x08); + send_ctrl_cmd(0xD51C);send_data_cmd(0x02); + send_ctrl_cmd(0xD51D);send_data_cmd(0x34); + send_ctrl_cmd(0xD51E);send_data_cmd(0x02); + send_ctrl_cmd(0xD51F);send_data_cmd(0x5F); + send_ctrl_cmd(0xD520);send_data_cmd(0x02); + send_ctrl_cmd(0xD521);send_data_cmd(0x78); + send_ctrl_cmd(0xD522);send_data_cmd(0x02); + send_ctrl_cmd(0xD523);send_data_cmd(0x94); + send_ctrl_cmd(0xD524);send_data_cmd(0x02); + send_ctrl_cmd(0xD525);send_data_cmd(0xA6); + send_ctrl_cmd(0xD526);send_data_cmd(0x02); + send_ctrl_cmd(0xD527);send_data_cmd(0xBB); + send_ctrl_cmd(0xD528);send_data_cmd(0x02); + send_ctrl_cmd(0xD529);send_data_cmd(0xCA); + send_ctrl_cmd(0xD52A);send_data_cmd(0x02); + send_ctrl_cmd(0xD52B);send_data_cmd(0xDB); + send_ctrl_cmd(0xD52C);send_data_cmd(0x02); + send_ctrl_cmd(0xD52D);send_data_cmd(0xe8); + send_ctrl_cmd(0xD52E);send_data_cmd(0x02); + send_ctrl_cmd(0xD52F);send_data_cmd(0xF9); + send_ctrl_cmd(0xD530);send_data_cmd(0x03); + send_ctrl_cmd(0xD531);send_data_cmd(0x1F); + send_ctrl_cmd(0xD532);send_data_cmd(0x03); + send_ctrl_cmd(0xD533);send_data_cmd(0x7F); + //BREGW + send_ctrl_cmd(0xD600);send_data_cmd(0x00); + send_ctrl_cmd(0xD601);send_data_cmd(0x2D); + send_ctrl_cmd(0xD602);send_data_cmd(0x00); + send_ctrl_cmd(0xD603);send_data_cmd(0x2E); + send_ctrl_cmd(0xD604);send_data_cmd(0x00); + send_ctrl_cmd(0xD605);send_data_cmd(0x32); + send_ctrl_cmd(0xD606);send_data_cmd(0x00); + send_ctrl_cmd(0xD607);send_data_cmd(0x44); + send_ctrl_cmd(0xD608);send_data_cmd(0x00); + send_ctrl_cmd(0xD609);send_data_cmd(0x53); + send_ctrl_cmd(0xD60A);send_data_cmd(0x00); + send_ctrl_cmd(0xD60B);send_data_cmd(0x88); + send_ctrl_cmd(0xD60C);send_data_cmd(0x00); + send_ctrl_cmd(0xD60D);send_data_cmd(0xB6); + send_ctrl_cmd(0xD60E);send_data_cmd(0x00); + send_ctrl_cmd(0xD60F);send_data_cmd(0xF3); + send_ctrl_cmd(0xD610);send_data_cmd(0x01); + send_ctrl_cmd(0xD611);send_data_cmd(0x22); + send_ctrl_cmd(0xD612);send_data_cmd(0x01); + send_ctrl_cmd(0xD613);send_data_cmd(0x64); + send_ctrl_cmd(0xD614);send_data_cmd(0x01); + send_ctrl_cmd(0xD615);send_data_cmd(0x92); + send_ctrl_cmd(0xD616);send_data_cmd(0x01); + send_ctrl_cmd(0xD617);send_data_cmd(0xD6); + send_ctrl_cmd(0xD618);send_data_cmd(0x02); + send_ctrl_cmd(0xD619);send_data_cmd(0x07); + send_ctrl_cmd(0xD61A);send_data_cmd(0x02); + send_ctrl_cmd(0xD61B);send_data_cmd(0x08); + send_ctrl_cmd(0xD61C);send_data_cmd(0x02); + send_ctrl_cmd(0xD61D);send_data_cmd(0x34); + send_ctrl_cmd(0xD61E);send_data_cmd(0x02); + send_ctrl_cmd(0xD61F);send_data_cmd(0x5F); + send_ctrl_cmd(0xD620);send_data_cmd(0x02); + send_ctrl_cmd(0xD621);send_data_cmd(0x78); + send_ctrl_cmd(0xD622);send_data_cmd(0x02); + send_ctrl_cmd(0xD623);send_data_cmd(0x94); + send_ctrl_cmd(0xD624);send_data_cmd(0x02); + send_ctrl_cmd(0xD625);send_data_cmd(0xA6); + send_ctrl_cmd(0xD626);send_data_cmd(0x02); + send_ctrl_cmd(0xD627);send_data_cmd(0xBB); + send_ctrl_cmd(0xD628);send_data_cmd(0x02); + send_ctrl_cmd(0xD629);send_data_cmd(0xCA); + send_ctrl_cmd(0xD62A);send_data_cmd(0x02); + send_ctrl_cmd(0xD62B);send_data_cmd(0xDB); + send_ctrl_cmd(0xD62C);send_data_cmd(0x02); + send_ctrl_cmd(0xD62D);send_data_cmd(0xe8); + send_ctrl_cmd(0xD62E);send_data_cmd(0x02); + send_ctrl_cmd(0xD62F);send_data_cmd(0xF9); + send_ctrl_cmd(0xD630);send_data_cmd(0x03); + send_ctrl_cmd(0xD631);send_data_cmd(0x1F); + send_ctrl_cmd(0xD632);send_data_cmd(0x03); + send_ctrl_cmd(0xD633);send_data_cmd(0x7F); + //Enable Page0 + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x00); + + send_ctrl_cmd(0xB100);send_data_cmd(0xCC); + send_ctrl_cmd(0xB101);send_data_cmd(0x00); + + + // SDT: + send_ctrl_cmd(0xB600);send_data_cmd(0x05); + // Gate EQ:); + send_ctrl_cmd(0xB700);send_data_cmd(0x70); + send_ctrl_cmd(0xB701);send_data_cmd(0x70); + + send_ctrl_cmd(0xB800);send_data_cmd(0x01); + send_ctrl_cmd(0xB801);send_data_cmd(0x03); + send_ctrl_cmd(0xB802);send_data_cmd(0x03); + send_ctrl_cmd(0xB803);send_data_cmd(0x03); + + + send_ctrl_cmd(0xBC00);send_data_cmd(0x00); + send_ctrl_cmd(0xBC01);send_data_cmd(0x00); + send_ctrl_cmd(0xBC02);send_data_cmd(0x00); + + + // Source EQ + send_ctrl_cmd(0xC900);send_data_cmd(0xD0); + send_ctrl_cmd(0xC901);send_data_cmd(0x02); + send_ctrl_cmd(0xC902);send_data_cmd(0x50); + send_ctrl_cmd(0xC903);send_data_cmd(0x50); + send_ctrl_cmd(0xC904);send_data_cmd(0x50); + +#ifdef TE_CONTROL + send_ctrl_cmd(0x3500);send_data_cmd(0x00);//ADD TE ON + send_ctrl_cmd(0x4400);send_data_cmd(0x01);//ADD + send_ctrl_cmd(0x4401);send_data_cmd(0x90);//ADD +#endif + + send_ctrl_cmd(0x3600);send_data_cmd(0x00); + send_ctrl_cmd(0x3A00);send_data_cmd(0x55);//16bit + + send_ctrl_cmd(0x2A00);send_data_cmd(0x00); + send_ctrl_cmd(0x2A01);send_data_cmd(0x00); + send_ctrl_cmd(0x2A02);send_data_cmd(HIGH_BYTE(FRAME_WIDTH)); + send_ctrl_cmd(0x2A03);send_data_cmd(LOW_BYTE(FRAME_WIDTH)); + send_ctrl_cmd(0x2B00);send_data_cmd(0x00); + send_ctrl_cmd(0x2B01);send_data_cmd(0x00); + send_ctrl_cmd(0x2B02);send_data_cmd(HIGH_BYTE(FRAME_HEIGHT)); + send_ctrl_cmd(0x2B03);send_data_cmd(LOW_BYTE(FRAME_HEIGHT)); + send_ctrl_cmd(0x2C00); + + send_ctrl_cmd(0x2000); + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; + */ + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects bus composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects bus composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 3; //, 4 + params->dbi.parallel.write_wait = 4; //6; + + params->dbi.parallel.read_setup = 2; // 4; // 3; + params->dbi.parallel.read_hold = 2; + params->dbi.parallel.read_latency = 18; // 18; + + params->dbi.parallel.wait_period = 1; // 2; // 2; + params->dbi.parallel.cs_high_width = 0; // 1; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + #ifdef TE_CONTROL + // enable tearing-free + /* + if (LCM_DBI_TE_MODE_DISABLED == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_Enable(FALSE)); + return; + } + + if (LCM_DBI_TE_MODE_VSYNC_ONLY == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY)); + } else if (LCM_DBI_TE_MODE_VSYNC_OR_HSYNC == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_OR_HSYNC)); + LCD_CHECK_RET(LCD_TE_ConfigVHSyncMode(dbi->te_hs_delay_cnt, + dbi->te_vs_width_cnt, + (LCD_TE_VS_WIDTH_CNT_DIV)dbi->te_vs_width_cnt_div)); + } else ASSERT(0); + + LCD_CHECK_RET(LCD_TE_SetEdgePolarity(dbi->te_edge_polarity)); + LCD_CHECK_RET(LCD_TE_Enable(TRUE)); + */ + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; //LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING; + + /* + * Notes: The body of the function LCD_TE_ConfigVHSyncMode() is void! + */ + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + #else + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + #endif +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(50); + send_ctrl_cmd(0x1000); + MDELAY(120); + +} + + +static void lcm_resume(void) +{ + #if 1 + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(20); + SET_RESET_PIN(1); + MDELAY(10); // 400 + + send_ctrl_cmd(0xF000);send_data_cmd(0x55); + send_ctrl_cmd(0xF001);send_data_cmd(0xAA); + send_ctrl_cmd(0xF002);send_data_cmd(0x52); + send_ctrl_cmd(0xF003);send_data_cmd(0x08); + send_ctrl_cmd(0xF004);send_data_cmd(0x01); + UDELAY(10); + + lcd_id = get_lcd_id_r(LCM_ID_REG) & 0xFF; + lcd_id = (lcd_id << 8) | (get_lcd_id_r(LCM_ID_REG + 1) & 0xFF); + + LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x2A00, HIGH_BYTE(x0), 0); + set_lcm_register(0x2A01, LOW_BYTE(x0), 0); + set_lcm_register(0x2A02, HIGH_BYTE(x1), 0); + set_lcm_register(0x2A03, LOW_BYTE(x1), 0); + set_lcm_register(0x2B00, HIGH_BYTE(y0), 0); + set_lcm_register(0x2B01, LOW_BYTE(y0), 0); + set_lcm_register(0x2B02, HIGH_BYTE(y1), 0); + set_lcm_register(0x2B03, LOW_BYTE(y1), 0); + + send_ctrl_cmd(0x2c00); + +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT(LCM_NAME"get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT(LCM_NAME"get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +//#include + +#include "lcm_drv.h" + +#if BUILD_UBOOT +//#include +#define LCD_PRINT printf +#else +#include + +#define LCD_PRINT printk +#endif + +/* + + */ + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define LCM_ID (0x84) +#define LCM_ID_REG (0xF4) + +#define LCM_NAME "[ZES588_HX8363B]" + +#define TE_CONTROL + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static unsigned int get_lcd_id_r(unsigned int addr); +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count); + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd((cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + + lcm_util.send_data((data)); + +} + +static __inline unsigned int read_data_cmd() +{ + unsigned int id = 0; + id = lcm_util.read_data(); + //id = (id << 8) | (lcm_util.read_data() & 0xff); + return id; +} + +static __inline void set_lcm_register(unsigned int regIndex, unsigned int regData, unsigned int uiDelay) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); + + if (uiDelay > 0) + MDELAY(uiDelay); +} + +static void lcm_update_black(unsigned int x, unsigned int y,unsigned int width, unsigned int height, unsigned short data) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width; + unsigned int y1 = y0 + height + 2; + unsigned int k, i; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + send_ctrl_cmd(0x2C); + + for (i = x0; i < x1; i++) + { + for (k = y0; k < y1; k++) + { + send_data_cmd(data); + send_data_cmd(data); + } + } + +} + +//static unsigned int vddhh = 0x69; + +static void init_lcm_registers(void) +{ +send_ctrl_cmd(0xB9); // SET password // B9h(Set OTP Related Setting) is the command in HX8369A +send_data_cmd(0xFF); +send_data_cmd(0x83); +send_data_cmd(0x63); +MDELAY(5); +/* +send_ctrl_cmd(0xB9); // SET password // B9h(Set OTP Related Setting) is the command in HX8369A +send_data_cmd(0xFF); +send_data_cmd(0x83); +send_data_cmd(0x63); +MDELAY(5); +*/ +//send_ctrl_cmd(0xBA); // SET DISP +//send_data_cmd(0x01); + +send_ctrl_cmd(0xB0); // SET DISP +send_data_cmd(0x01); +send_data_cmd(0x07); + + +send_ctrl_cmd(0xB1); //SET Power +send_data_cmd(0x78); //0x01 +send_data_cmd(0x00); +send_data_cmd(0x44); +send_data_cmd(0x07); +send_data_cmd(0x01); +send_data_cmd(0x0e); //0x0E +send_data_cmd(0x0e); //0x0E +send_data_cmd(0x21); +send_data_cmd(0x29); +send_data_cmd(0x3F); +send_data_cmd(0x3F); +send_data_cmd(0x40); +send_data_cmd(0x32);//HX 5186A +send_data_cmd(0x00); +send_data_cmd(0xE6); +send_data_cmd(0xE6); +send_data_cmd(0xE6); +send_data_cmd(0xE6); +send_data_cmd(0xE6); + +MDELAY(5); + + +send_ctrl_cmd(0xB2); // SET DISP +send_data_cmd(0x08); +send_data_cmd(0x00); + +MDELAY(1); + + +send_ctrl_cmd(0xB2); // SET DISP +send_data_cmd(0x0f); + + + +send_ctrl_cmd(0xB4); // SET CYC +send_data_cmd(0x01); //0x00 +send_data_cmd(0x18); +send_data_cmd(0x9C); +send_data_cmd(0x08); +send_data_cmd(0x18); +send_data_cmd(0x04); +send_data_cmd(0x72); + +MDELAY(1); + + +send_ctrl_cmd(0xBF); // SET VCOM for Max=-2.5V +send_data_cmd(0x05); +send_data_cmd(0x60); +send_data_cmd(0x00); +send_data_cmd(0x10); + +MDELAY(5); + + + +send_ctrl_cmd(0xB6); // SET VCOM +send_data_cmd(0x30); //30 + +MDELAY(5); + + +send_ctrl_cmd(0xCC); // SET Panel +send_data_cmd(0x03);// 03 +MDELAY(5); + + +send_ctrl_cmd(0xE0); // SET Gamma +send_data_cmd(0x00); +send_data_cmd(0x00); +send_data_cmd(0x00); +send_data_cmd(0x07); +send_data_cmd(0x08); +send_data_cmd(0x3F); +send_data_cmd(0x0F); +send_data_cmd(0x2A); +send_data_cmd(0x80); +send_data_cmd(0x87); +send_data_cmd(0xD2); +send_data_cmd(0xD6); +send_data_cmd(0xD9); +send_data_cmd(0x17); +send_data_cmd(0x17); +send_data_cmd(0x12); +send_data_cmd(0x17); +send_data_cmd(0x00); +send_data_cmd(0x00); +send_data_cmd(0x00); +send_data_cmd(0x07); +send_data_cmd(0x08); +send_data_cmd(0x3F); +send_data_cmd(0x0F); +send_data_cmd(0x2A); +send_data_cmd(0x80); +send_data_cmd(0x87); +send_data_cmd(0xD2); +send_data_cmd(0xD6); +send_data_cmd(0xD9); +send_data_cmd(0x17); +send_data_cmd(0x17); +send_data_cmd(0x12); +send_data_cmd(0x17); +send_data_cmd(0x0D); + +MDELAY(5); + +send_ctrl_cmd(0xC2); // SET Panel +send_data_cmd(0x02); +MDELAY(5); +send_ctrl_cmd(0x3A); +send_data_cmd(0x55); +MDELAY(5); + +#ifdef TE_CONTROL +send_ctrl_cmd(0x35); // SET Panel +send_data_cmd(0x00); +MDELAY(5); +#endif + +send_ctrl_cmd(0x36); // SET Panel +send_data_cmd(0x80); +MDELAY(5); + +send_ctrl_cmd(0x2A); +send_data_cmd(0); +send_data_cmd(0); +send_data_cmd(HIGH_BYTE(FRAME_WIDTH)); +send_data_cmd(LOW_BYTE(FRAME_WIDTH)); + +send_ctrl_cmd(0x2B); +send_data_cmd(0); +send_data_cmd(0); +send_data_cmd(HIGH_BYTE(FRAME_HEIGHT)); +send_data_cmd(LOW_BYTE(FRAME_HEIGHT)); + +send_ctrl_cmd(0x11); //Sleep Out +MDELAY(120); + +send_ctrl_cmd(0x29); //Display On +MDELAY(50); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +/* + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; + */ + +/* + * ATTENTIONS: There are a few important differences under the MT6575/15 compared with the MT6573/13 + * + * type: if set LCM_TYPE_DBI, cpu interface. + * io_select_mode: if set 0, selects bus composition: LPA0, LWRB, LRDB control bus and NLD[0:15] data bus + * if set 1, selects bus composition: DPIVSYNC, DPIDE, DPIHSYNC control bus and DPIRGB data bus. + * dbi.port: 0 -- select parallel port 0; 1 -- select parallel port 1 + * + * Author: chu, zewei + * Date: 2012/09/05 + */ +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; //LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; // LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; // LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; // LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; //LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; // 2; + params->dbi.parallel.write_hold = 3; // 3; // 3; // 2, 4 + params->dbi.parallel.write_wait = 6; // 6; //6; + + params->dbi.parallel.read_setup = 2; // 2; // 4; // 3; + params->dbi.parallel.read_hold = 3; // 3; + params->dbi.parallel.read_latency = 18; // 18; + + params->dbi.parallel.wait_period = 1; // 2; // 2; + params->dbi.parallel.cs_high_width = 0; // 1; //cycles of cs high level between each transfer + //params->dbi.parallel.read_latency = 20; //40 + //params->dbi.parallel.wait_period = 10; // 0 + + #ifdef TE_CONTROL + // enable tearing-free + /* + if (LCM_DBI_TE_MODE_DISABLED == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_Enable(FALSE)); + return; + } + + if (LCM_DBI_TE_MODE_VSYNC_ONLY == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY)); + } else if (LCM_DBI_TE_MODE_VSYNC_OR_HSYNC == dbi->te_mode) { + LCD_CHECK_RET(LCD_TE_SetMode(LCD_TE_MODE_VSYNC_OR_HSYNC)); + LCD_CHECK_RET(LCD_TE_ConfigVHSyncMode(dbi->te_hs_delay_cnt, + dbi->te_vs_width_cnt, + (LCD_TE_VS_WIDTH_CNT_DIV)dbi->te_vs_width_cnt_div)); + } else ASSERT(0); + + LCD_CHECK_RET(LCD_TE_SetEdgePolarity(dbi->te_edge_polarity)); + LCD_CHECK_RET(LCD_TE_Enable(TRUE)); + */ + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; //LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; //LCM_POLARITY_FALLING; + + /* + * Notes: The body of the function LCD_TE_ConfigVHSyncMode() is void! + */ + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + #else + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + #endif +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(120); + + init_lcm_registers(); + lcm_update_black(0, 0, FRAME_WIDTH, FRAME_HEIGHT, 0x00); +} + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x2800); + MDELAY(50); + send_ctrl_cmd(0x1000); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + #if 1 + send_ctrl_cmd(0x1100); + MDELAY(120); + send_ctrl_cmd(0x2900); + MDELAY(50); + #else + unsigned int lcd_id = 0; + + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(100); // 400 + + send_ctrl_cmd(0xB9); + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x63); + UDELAY(10); + + lcd_id = get_lcd_id_n(LCM_ID_REG, 2) & 0xFF; + LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); + + init_lcm_registers(); + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + +static unsigned int get_lcd_id_r(unsigned int addr) +{ + unsigned short id = 0; + + send_ctrl_cmd(addr); + id = read_data_cmd(); + + LCD_PRINT(LCM_NAME"get_lcd_id_r: id = 0x%x\n", id); + return id; +} + +static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) +{ + volatile unsigned int id = 0; + unsigned char k = 0; + + + send_ctrl_cmd(addr); + + while (k < count) + { + id = read_data_cmd(); + k++; + } + LCD_PRINT(LCM_NAME"get_lcd_id_n: id = 0x%x\n", id); + + return id; +} + + +static void lcm_setbacklight(unsigned int level) +{ + /* + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); + */ +} + +static void lcm_setpwm(unsigned int divider) +{ + /* + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); + */ +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (240) +#define LCM_ID (0x57) +// --------------------------------------------------------------------------- +// Local Variables: +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (10) +#define POWER_ON_SEQ_DELAY (200) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0x00FF & (lcm_util.read_data() >> 1); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd((regIndex & 0x00FF) << 1); + send_data_cmd((regData & 0x00FF) << 1); +} + + +static void init_lcm_registers(void) +{ + + + //=======wenbo add============== + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x0072, 0x00F6); + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x00F2, 0x0000); + set_lcm_register(0x00E4, 0x0000); + set_lcm_register(0x00E5, 0x001C); + set_lcm_register(0x00E6, 0x0000); + set_lcm_register(0x00E7, 0x001C); + set_lcm_register(0x00EE, 0x0042); + set_lcm_register(0x00EF, 0x00DB); + set_lcm_register(0x002E, 0x0098); + set_lcm_register(0x0040, 0x0000); + set_lcm_register(0x0041, 0x002E); + set_lcm_register(0x0042, 0x002D); + set_lcm_register(0x0043, 0x003F); + set_lcm_register(0x0044, 0x003F); + set_lcm_register(0x0045, 0x003F); + set_lcm_register(0x0046, 0x002C); + set_lcm_register(0x0047, 0x007F); + set_lcm_register(0x0048, 0x0007); + set_lcm_register(0x0049, 0x0005); + set_lcm_register(0x004A, 0x0008); + set_lcm_register(0x004B, 0x0013); + set_lcm_register(0x004C, 0x001E); + set_lcm_register(0x0050, 0x0000); + set_lcm_register(0x0051, 0x0000); + set_lcm_register(0x0052, 0x0000); + set_lcm_register(0x0053, 0x0012); + set_lcm_register(0x0054, 0x0011); + set_lcm_register(0x0055, 0x003F); + set_lcm_register(0x0056, 0x0000); + set_lcm_register(0x0057, 0x0053); + set_lcm_register(0x0058, 0x0001); + set_lcm_register(0x0059, 0x000C); + set_lcm_register(0x005A, 0x0017); + set_lcm_register(0x005B, 0x001A); + set_lcm_register(0x005C, 0x0018); + set_lcm_register(0x005D, 0x00C3); + set_lcm_register(0x0002, 0x0000); + set_lcm_register(0x0003, 0x0000); + set_lcm_register(0x0004, 0x0001); + set_lcm_register(0x0005, 0x003F); + set_lcm_register(0x0006, 0x0000); + set_lcm_register(0x0007, 0x0000); + set_lcm_register(0x0008, 0x0000); + set_lcm_register(0x0009, 0x00EF); // + set_lcm_register(0x0024, 0x0022); + set_lcm_register(0x0025, 0x0064); + set_lcm_register(0x0023, 0x0090); + set_lcm_register(0x001B, 0x000E); + set_lcm_register(0x001D, 0x0011); + set_lcm_register(0x0019, 0x0001); + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x0001, 0x0000); + set_lcm_register(0x001F, 0x0080); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x0090); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x00D4); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x0028, 0x0008); + MDELAY(40); + set_lcm_register(0x0028, 0x0038); + MDELAY(40); //DELAY 40MS + set_lcm_register(0x0028, 0x003C); + //wr_com(0x0016, 0x0020); //0020 + set_lcm_register(0x0017, 0x0006); //18bit + send_ctrl_cmd(0x0022 << 1); + //===========wenbo add end========= + + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; //LCM_DBI_CLOCK_FREQ_52M + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2;//1; //0 + params->dbi.parallel.write_hold = 1; ////3 33 + params->dbi.parallel.write_wait = 3; //3// + params->dbi.parallel.read_setup = 0; ////2 + params->dbi.parallel.read_latency = 10; ////19 + params->dbi.parallel.wait_period = 0; ////0 +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + + static void lcm_suspend(void) + { + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0004); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0000); + + set_lcm_register(0x001F, 0x0089); + + set_lcm_register(0x0019, 0x0000); + + + /* set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); + */ + } + + + +static void lcm_resume(void) + { + + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0019, 0x0001); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x001F, 0x0080); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x00D4); + + MDELAY(5); + + set_lcm_register(0x0028, 0x0008); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x003C); + + /* set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); + */ + } + + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) + { + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x0022 << 1); + } + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER zte6516_lcm_drv = +{ + .name = "zte6516", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/bq_aquaris77/lcm/bm8578/bm8578.c b/bq_aquaris77/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..a723aa4 --- /dev/null +++ b/bq_aquaris77/lcm/bm8578/bm8578.c @@ -0,0 +1,304 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/bq_aquaris77/lcm/dummy/dummy.c b/bq_aquaris77/lcm/dummy/dummy.c new file mode 100644 index 0000000..a9fb64a --- /dev/null +++ b/bq_aquaris77/lcm/dummy/dummy.c @@ -0,0 +1,145 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/bq_aquaris77/lcm/ha5266/ha5266.c b/bq_aquaris77/lcm/ha5266/ha5266.c new file mode 100644 index 0000000..a0f548a --- /dev/null +++ b/bq_aquaris77/lcm/ha5266/ha5266.c @@ -0,0 +1,333 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +/* send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00);*/ +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 7; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 30; + params->dpi.hsync_back_porch = 16; + params->dpi.hsync_front_porch = 210; + params->dpi.vsync_pulse_width = 13; + params->dpi.vsync_back_porch = 10; + params->dpi.vsync_front_porch = 22; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA;; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + // init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +/* send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20);*/ +} + + +static void lcm_resume(void) +{ +/* send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900);*/ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ha5266_lcm_drv = +{ + .name = "ha5266", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/bq_aquaris77/lcm/hsd070idw1/hsd070idw1.c b/bq_aquaris77/lcm/hsd070idw1/hsd070idw1.c new file mode 100644 index 0000000..7e527fd --- /dev/null +++ b/bq_aquaris77/lcm/hsd070idw1/hsd070idw1.c @@ -0,0 +1,153 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 8; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 48; + params->dpi.hsync_back_porch = 40; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 29; + params->dpi.vsync_front_porch = 13; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + //program reset pin + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +} + + +static void lcm_suspend(void) +{ +//disable output pixel clk +} + + +static void lcm_resume(void) +{ +//enable output pixel clk +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hsd070idw1_lcm_drv = +{ + .name = "hsd070idw1", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/bq_aquaris77/lcm/hx8357B/hx8357b.c b/bq_aquaris77/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..f33e7fd --- /dev/null +++ b/bq_aquaris77/lcm/hx8357B/hx8357b.c @@ -0,0 +1,317 @@ +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/bq_aquaris77/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c b/bq_aquaris77/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c new file mode 100644 index 0000000..c0b9890 --- /dev/null +++ b/bq_aquaris77/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c @@ -0,0 +1,456 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, +#else//new 20120224 +{0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x0E, 0x0E, 0x21, + 0x29, 0x3F, 0x3F, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 7, {0x02, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x1C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBF, 1, {0x05, 0x60, 0x00, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xE2, 1, {0x01}},//0x01=dynamic,0x00=static + {REGFLAG_DELAY, 10, {}}, + + {0xE5, 1, {0x15}},//0x15 L, 0x16 M, 0x17 H + {REGFLAG_DELAY, 10, {}}, +#endif + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + // SET GAMMA + #if 0 + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x85, 0x89, 0xCC, 0xD1, + 0xD6, 0x15, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x85, 0x89, 0xCC, + 0xD1, 0xD6, 0x15, 0x15, + 0x12, 0x18}}, +#else//new 20120224 +{0xE0, 34, {0x00, 0x06, 0x0A, 0x12, + 0x15, 0x3B, 0x1D, 0x34, + 0x87, 0x8E, 0xCC, 0xCF, + 0xCE, 0x0E, 0x12, 0x11, + 0x18, 0x00, 0x06, 0x0A, + 0x12, 0x15, 0x3B, 0x1D, + 0x34, 0x87, 0x8E, 0xCC, + 0xCF, 0xCE, 0x0E, 0x12, + 0x11, 0x18}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x14}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x00,0X03}},//17.143kHz + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +/* +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +*/ + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_mode_setting[] = { + {0x55, 1, {0x1}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setbacklight_mode(unsigned int mode) +{ + lcm_backlight_mode_setting[0].para_list[0] = mode; + push_table(lcm_backlight_mode_setting, sizeof(lcm_backlight_mode_setting) / sizeof(struct LCM_setting_table), 1); +} + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, +#else//new 20120224 +{0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x0E, 0x0E, 0x21, + 0x29, 0x3F, 0x3F, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 7, {0x02, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x1C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBF, 1, {0x05, 0x60, 0x00, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xE2, 1, {0x01}},//0x01=dynamic,0x00=static + {REGFLAG_DELAY, 10, {}}, + + {0xE5, 1, {0x15}},//0x15 L, 0x16 M, 0x17 H + {REGFLAG_DELAY, 10, {}}, +#endif + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + // SET GAMMA + #if 0 + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x85, 0x89, 0xCC, 0xD1, + 0xD6, 0x15, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x85, 0x89, 0xCC, + 0xD1, 0xD6, 0x15, 0x15, + 0x12, 0x18}}, +#else//new 20120224 +{0xE0, 34, {0x00, 0x06, 0x0A, 0x12, + 0x15, 0x3B, 0x1D, 0x34, + 0x87, 0x8E, 0xCC, 0xCF, + 0xCE, 0x0E, 0x12, 0x11, + 0x18, 0x00, 0x06, 0x0A, + 0x12, 0x15, 0x3B, 0x1D, + 0x34, 0x87, 0x8E, 0xCC, + 0xCF, 0xCE, 0x0E, 0x12, + 0x11, 0x18}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x14}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x00,0X03}},//17.143kHz + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +/* +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +*/ + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_mode_setting[] = { + {0x55, 1, {0x1}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setbacklight_mode(unsigned int mode) +{ + lcm_backlight_mode_setting[0].para_list[0] = mode; + push_table(lcm_backlight_mode_setting, sizeof(lcm_backlight_mode_setting) / sizeof(struct LCM_setting_table), 1); +} + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0xff);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x02);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + sw_clear_panel(0); + send_ctrl_cmd(0x10); + MDELAY(5); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + send_ctrl_cmd(0xC3); + send_data_cmd(0xFF); + + send_ctrl_cmd(0xF4); + read_data_cmd(); + return (LCM_ID == read_data_cmd())?1:0; +} + +LCM_DRIVER hx8369_6575_lcm_drv = +{ + .name = "hx8369_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id, +}; + + diff --git a/bq_aquaris77/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c b/bq_aquaris77/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c new file mode 100644 index 0000000..1ac6947 --- /dev/null +++ b/bq_aquaris77/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c @@ -0,0 +1,512 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, ///apply it as ESD indication + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[2]; + unsigned int array[16]; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + read_reg_v2(0xF4, buffer, 2); + id = buffer[0]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hx8369_dsi_6575_lcm_drv = +{ + .name = "hx8369_dsi_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + .set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + .esd_check = lcm_esd_check, + .esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c b/bq_aquaris77/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c new file mode 100644 index 0000000..e6b0110 --- /dev/null +++ b/bq_aquaris77/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c @@ -0,0 +1,427 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include ///for printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include ///for printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + #if 0//zhaoshaopeng for tianmas + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x01,0x00,0x34,0x0A,0x00,0x11,0x11, + 0x32,0x2f,0x3F,0x3F,0x01,0x3a,0x01,0xE6,0xE6,0xE6,0xE6,0xE6}}, + + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00,0x20,0x03,0x03,0x70,0x00,0xFF, + 0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x01}}, + + {REGFLAG_DELAY, 10, {}}, + + //{0xB4, 5, {0x02,0x18,0x80,0x10,0x01}}, + {0xB4, 5, {0x02,0x1d,0x80,0x06,0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 2, {0x4b, 0x4b}}, + + {0x36, 1, {0x00}}, + /* + {0xD5, 26, {0x00,0x07,0x00,0x00,0x01,0x0a,0x10, + 0x60,0x33,0x37,0x23,0x01,0xB9,0x75,0xA8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + */ + {0xD5, 26, {0x00,0x01,0x03,0x34,0x34,0x04,0x00, + 0x70,0x11,0x13,0x00,0x00,0x60,0x24,0x71,0x35,0x00,0x00,0x71,0x05, + 0x60,0x04,0x07,0x0F,0x04,0x04}}, + {REGFLAG_DELAY, 10, {}}, + + + // SET GAMMA + {0xE0, 34, {0x00,0x02,0x0b,0x13,0x0b,0x18,0x24,0x30, + 0x09,0x13,0x0f,0x15,0x15,0x14,0x15,0x0c,0x0c,0x00,0x02,0x0b,0x13,0x0b, + 0x18,0x24,0x30,0x09,0x13,0x0f,0x15,0x15,0x14,0x15,0x0c,0x0c}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCC, 1, {0x00}}, + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + + {0x3A, 1, {0x77}}, + //{0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x02,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}}, + {0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x00,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}}, + + // Sleep Out + {0x11, 0, {}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 0, {}}, + {REGFLAG_DELAY, 150, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. +#else + #if 0//zhaoshaopeng for baolongda gamma 2.5 20120327 + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + //{0xB1, 19, {0x78,0x00,0x34,0x07,0x00,0x0E,0x0E, + // 0x21,0x29,0x3F,0x3F,0x01,0x63,0x01,0xE6,0xE6,0xE6,0xE6,0xE6}}, + {0xB1, 19, {0x01,0x00,0x34,0x07,0x00,0x0E,0x0E, + 0x21,0x29,0x3F,0x3F,0x01,0x63,0x01,0xE6,0xE6,0xE6,0xE6,0xE6}}, + + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00,0x20,0x07,0x07,0x70,0x00,0xFF, + 0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x01}}, + + {REGFLAG_DELAY, 10, {}}, + + //{0xB4, 5, {0x02,0x18,0x80,0x10,0x01}}, + {0xB4, 5, {0x02,0x0c,0x84,0x0c,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 2, {0x1f, 0x1f}}, + + {0xCC, 1, {0x00}}, + + /* + {0xD5, 26, {0x00,0x07,0x00,0x00,0x01,0x0a,0x10, + 0x60,0x33,0x37,0x23,0x01,0xB9,0x75,0xA8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + */ + {0xD5, 26, {0x00,0x01,0x00,0x00,0x01,0x06,0x10, + 0x80,0x73,0x37,0x01,0x22,0xb9,0x75,0xa8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + + // SET GAMMA + {0xE0, 34, {0x00,0x03,0x00,0x09,0x09,0x21,0x17,0x2a, + 0x06,0x0c,0x10,0x12,0x15,0x14,0x16,0x12,0x18,0x00,0x03,0x00,0x09,0x09, + 0x21,0x17,0x2a,0x06,0x0c,0x10,0x12,0x15,0x14,0x16,0x12,0x18}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + + {0x3A, 1, {0x77}}, + //{0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x02,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}}, + {0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x00,0x10,0x30,0x6c,0x02,0x11,0x18,0x40}}, + + // Sleep Out + {0x11, 0, {}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 0, {}}, + {REGFLAG_DELAY, 150, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + #else//command mode + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x01,0x00,0x34,0x07,0x00,0x0E,0x0E, + 0x21,0x29,0x3F,0x3F,0x01,0x63,0x01,0xE6,0xE6,0xE6,0xE6,0xE6}}, + + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00,0x20,0x07,0x07,0x70,0x00,0xFF, + 0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x01}}, + + {REGFLAG_DELAY, 10, {}}, + + //{0xB4, 5, {0x02,0x18,0x80,0x10,0x01}}, + {0xB4, 5, {0x02,0x0c,0x84,0x0c,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 2, {0x1f, 0x1f}}, + + {0xCC, 1, {0x00}}, + + /* + {0xD5, 26, {0x00,0x07,0x00,0x00,0x01,0x0a,0x10, + 0x60,0x33,0x37,0x23,0x01,0xB9,0x75,0xA8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + */ + {0xD5, 26, {0x00,0x01,0x00,0x00,0x01,0x06,0x10, + 0x80,0x73,0x37,0x01,0x22,0xb9,0x75,0xa8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + + // SET GAMMA + {0xE0, 34, {0x00,0x03,0x00,0x09,0x09,0x21,0x1B,0x2D, + 0x06,0x0c,0x10,0x15,0x16,0x14,0x16,0x12,0x18,0x00,0x03,0x00,0x09,0x09, + 0x21,0x1B,0x2D,0x06,0x0c,0x10,0x15,0x16,0x14,0x16,0x12,0x18}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + + {0x3A, 1, {0x77}}, + //{0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x02,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}}, + {0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x00,0x10,0x30,0x6c,0x02,0x11,0x18,0x40}}, + + // Sleep Out + {0x11, 0, {}}, + {REGFLAG_DELAY, 200, {}}, + + // Display ON + {0x29, 0, {}}, + {REGFLAG_DELAY, 200, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + #endif + +#endif + + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + //{0x78, 1, {0x00}},//zhaoshaopeng add from baolongda for 1ma leackage + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + unsigned char lcd_id =0; + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(125); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + #if 0 + SET_RESET_PIN(0); + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(1); + SET_RESET_PIN(1); + #else + char null = 0; + dsi_set_cmdq_V2(0x28, 1, &null, 1); + MDELAY(200); + dsi_set_cmdq_V2(0x10, 1, &null, 1); + MDELAY(200); + SET_RESET_PIN(0); + //dsi_set_cmdq_V2(0x78, 1, &null, 1); + MDELAY(1); + SET_RESET_PIN(1); + #endif +} + + +static void lcm_resume(void) +{ + lcm_init(); + + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[2]; + unsigned int array[16]; + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + unsigned char lcd_id = 0; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(50); + + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + read_reg_v2(0xF4, buffer, 2); + id = buffer[0]; //we only need ID + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + lcd_id = mt_get_gpio_in(GPIO_LCD_ID); +#if defined(BUILD_UBOOT) + printf("%s, zhaoshaopeng id = 0x%08x, lcd_id_det = %x\n", __func__, id, lcd_id); + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + if((id == LCM_ID)&&(lcd_id ==0)) + return 1; + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hx8369_dsi_bld_lcm_drv = +{ + .name = "hx8369_dsi_bld", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/hx8369_dsi/hx8369_dsi.c b/bq_aquaris77/lcm/hx8369_dsi/hx8369_dsi.c new file mode 100644 index 0000000..4e09776 --- /dev/null +++ b/bq_aquaris77/lcm/hx8369_dsi/hx8369_dsi.c @@ -0,0 +1,424 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 5, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 5, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 5, {}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 5, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active = 3; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +/* // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING;*/ +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + #if 1//zhaoshaopeng for tianmas + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x01,0x00,0x34,0x0A,0x00,0x11,0x11, + 0x32,0x2f,0x3F,0x3F,0x01,0x3a,0x01,0xE6,0xE6,0xE6,0xE6,0xE6}}, + + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00,0x20,0x03,0x03,0x70,0x00,0xFF, + 0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x01}}, + + {REGFLAG_DELAY, 10, {}}, + + //{0xB4, 5, {0x02,0x18,0x80,0x10,0x01}}, + {0xB4, 5, {0x02,0x1d,0x80,0x06,0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 2, {0x4b, 0x4b}}, + + {0x36, 1, {0x00}}, + /* + {0xD5, 26, {0x00,0x07,0x00,0x00,0x01,0x0a,0x10, + 0x60,0x33,0x37,0x23,0x01,0xB9,0x75,0xA8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + */ + {0xD5, 26, {0x00,0x01,0x03,0x34,0x34,0x04,0x00, + 0x70,0x11,0x13,0x00,0x00,0x60,0x24,0x71,0x35,0x00,0x00,0x71,0x05, + 0x60,0x04,0x07,0x0F,0x04,0x04}}, + {REGFLAG_DELAY, 10, {}}, + + + // SET GAMMA + {0xE0, 34, {0x00,0x02,0x0b,0x13,0x0b,0x18,0x24,0x30, + 0x09,0x13,0x0f,0x15,0x15,0x14,0x15,0x0c,0x0c,0x00,0x02,0x0b,0x13,0x0b, + 0x18,0x24,0x30,0x09,0x13,0x0f,0x15,0x15,0x14,0x15,0x0c,0x0c}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCC, 1, {0x00}}, + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + + {0x3A, 1, {0x77}}, + //{0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x02,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}}, + {0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x00,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}}, + + // Sleep Out + {0x11, 0, {}}, + {REGFLAG_DELAY, 200, {}}, + + // Display ON + {0x29, 0, {}}, + {REGFLAG_DELAY, 200, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. +#else + #if 0//zhaoshaopeng for baolongda 20120320 + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x01,0x00,0x34,0x07,0x00,0x0E,0x0E, + 0x21,0x29,0x42,0x42,0x01,0x43,0x01,0xE6,0xE6,0xE6,0xE6,0xE6}}, + + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00,0x20,0x07,0x07,0x70,0x00,0xFF, + 0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x01}}, + + {REGFLAG_DELAY, 10, {}}, + + //{0xB4, 5, {0x02,0x18,0x80,0x10,0x01}}, + {0xB4, 5, {0x02,0x0c,0x84,0x0c,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 2, {0x1f, 0x1f}}, + + {0xCC, 1, {0x00}}, + + /* + {0xD5, 26, {0x00,0x07,0x00,0x00,0x01,0x0a,0x10, + 0x60,0x33,0x37,0x23,0x01,0xB9,0x75,0xA8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + */ + {0xD5, 26, {0x00,0x01,0x00,0x00,0x01,0x06,0x10, + 0x80,0x73,0x37,0x01,0x22,0xb9,0x75,0xa8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + + // SET GAMMA + {0xE0, 34, {0x00,0x03,0x00,0x09,0x09,0x21,0x1B,0x2D, + 0x06,0x0c,0x10,0x15,0x16,0x14,0x16,0x12,0x18,0x00,0x03,0x00,0x09,0x09, + 0x21,0x1B,0x2D,0x06,0x0c,0x10,0x15,0x16,0x14,0x16,0x12,0x18}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + + {0x3A, 1, {0x77}}, + //{0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x02,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}}, + {0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x00,0x10,0x30,0x6c,0x02,0x11,0x18,0x40}}, + + // Sleep Out + {0x11, 0, {}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 0, {}}, + {REGFLAG_DELAY, 150, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + #else//command mode + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x01,0x00,0x34,0x07,0x00,0x0E,0x0E, + 0x21,0x29,0x3F,0x3F,0x01,0x63,0x01,0xE6,0xE6,0xE6,0xE6,0xE6}}, + + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00,0x20,0x07,0x07,0x70,0x00,0xFF, + 0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x01}}, + + {REGFLAG_DELAY, 10, {}}, + + //{0xB4, 5, {0x02,0x18,0x80,0x10,0x01}}, + {0xB4, 5, {0x02,0x0c,0x84,0x0c,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 2, {0x1f, 0x1f}}, + + {0xCC, 1, {0x00}}, + + /* + {0xD5, 26, {0x00,0x07,0x00,0x00,0x01,0x0a,0x10, + 0x60,0x33,0x37,0x23,0x01,0xB9,0x75,0xA8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + */ + {0xD5, 26, {0x00,0x01,0x00,0x00,0x01,0x06,0x10, + 0x80,0x73,0x37,0x01,0x22,0xb9,0x75,0xa8,0x64,0x00,0x00,0x41,0x06, + 0x50,0x07,0x07,0x0F,0x07,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + + // SET GAMMA + {0xE0, 34, {0x00,0x03,0x00,0x09,0x09,0x21,0x1B,0x2D, + 0x06,0x0c,0x10,0x15,0x16,0x14,0x16,0x12,0x18,0x00,0x03,0x00,0x09,0x09, + 0x21,0x1B,0x2D,0x06,0x0c,0x10,0x15,0x16,0x14,0x16,0x12,0x18}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + + {0x3A, 1, {0x77}}, + //{0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x02,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}}, + {0xBA, 13, {0x00,0xA0,0xC6,0x00,0x0A,0x00,0x10,0x30,0x6c,0x02,0x11,0x18,0x40}}, + + // Sleep Out + {0x11, 0, {}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 0, {}}, + {REGFLAG_DELAY, 150, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + #endif + +#endif + + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + //{0x78, 1, {0x00}},//zhaoshaopeng add from baolongda for 1ma leackage + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + unsigned char lcd_id =0; + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(125); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + #if 0 + SET_RESET_PIN(0); + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(1); + SET_RESET_PIN(1); + #else + char null = 0; + dsi_set_cmdq_V2(0x28, 1, &null, 1); + MDELAY(200); + dsi_set_cmdq_V2(0x10, 1, &null, 1); + MDELAY(200); + SET_RESET_PIN(0); + //dsi_set_cmdq_V2(0x78, 1, &null, 1); + MDELAY(1); + SET_RESET_PIN(1); + #endif +} + + +static void lcm_resume(void) +{ + lcm_init(); + + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[2]; + unsigned int array[16]; + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + unsigned char lcd_id = 0; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(50); + + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + read_reg_v2(0xF4, buffer, 2); + id = buffer[0]; //we only need ID + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + lcd_id = mt_get_gpio_in(GPIO_LCD_ID); +#if defined(BUILD_UBOOT) + printf("%s, zhaoshaopeng id = 0x%08x, lcd_id_det = %x\n", __func__, id, lcd_id); + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + if((id == LCM_ID)&&(lcd_id ==1)) + return 1; + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hx8369_dsi_tm_lcm_drv = +{ + .name = "hx8369_dsi_tm", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/hx8369b_dsi_vdo/hx8369b_dsi_vdo.c b/bq_aquaris77/lcm/hx8369b_dsi_vdo/hx8369b_dsi_vdo.c new file mode 100644 index 0000000..f108fb3 --- /dev/null +++ b/bq_aquaris77/lcm/hx8369b_dsi_vdo/hx8369b_dsi_vdo.c @@ -0,0 +1,592 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XAA +#define REGFLAG_END_OF_TABLE 0xAB // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[128]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + + {0xB1, 10, {0x12, 0x83, 0x77, 0x00, + 0x8F, 0x0F, 0x1A, 0x1A, + 0x0C, 0x0A}}, + + {0xB2, 3, {0x00, 0x10, 0x02}}, + + {0xB3, 4, {0x83, 0x00, 0x31, 0x03}}, + + {0xB4, 1, {0x42}}, + + {0xB6, 2, {0x7F, 0x7F}}, + + {0xE3, 4, {0x01, 0x01, 0x01, 0x01}}, + + {0xC0, 6, {0x73, 0x50, 0x00, 0x3C, + 0xC4, 0x00}}, + + {0xCC, 1, {0x00}}, + +#if 1 + {0xD5, 92, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#else + {0xD5, 59, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00}}, + + {0xFD, 34, { + 0xAA, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#endif + +#if 0 + {0xD5, 56, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00}}, + + {0xFD, 38, {0xAA, 0xAA, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#endif + + {0xE0, 35, {0x00, 0x0C, 0x00, 0x10, + 0x14, 0x3C, 0x27, 0x34, + 0x0C, 0x10, 0x11, 0x15, + 0x18, 0x16, 0x16, 0x13, + 0x18, 0x0C, 0x00, 0x0C, + 0x10, 0x14, 0x3C, 0x27, + 0x34, 0x0C, 0x10, 0x11, + 0x15, 0x18, 0x16, 0x16, + 0x13, 0x18, 0x01}}, + + {0xEA, 1, {0x62}}, + + {0x3A, 1, {0x77}}, + + {0xBA, 15, {0x11, 0x00, 0x16, 0xC6, + 0x00, 0x0A, 0x00, 0x10, + 0x24, 0x02, 0x21, 0x21, + 0x9A, 0x17, 0x1D}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i, j, k; + unsigned int para_int, read_int; + unsigned char buffer[256]; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); +#if 0 + do { + read_int = read_reg(cmd); + para_int = *((unsigned int *)table[i].para_list); + printf("%s, compare = {%04x, %04x} \n", __func__, read_int, para_int); + } while(read_int != para_int); +#endif + } + } + +#if 0//defined(BUILD_UBOOT) + int remain_bytes; + int r_byte_count; + unsigned int array[16]; + + for(i = 0; i < count; i++) { + if(table[i].cmd != REGFLAG_DELAY && table[i].cmd != REGFLAG_END_OF_TABLE) + { + remain_bytes = table[i].count; + j = 0; + + do { + //printf("Read 0x%02x round %d. Remain %d bytes \n", table[i].cmd, j, remain_bytes); + r_byte_count = (remain_bytes > 8) ? 8 : remain_bytes; + + array[0] = 0x00003700 | (r_byte_count<<16);// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + + if(j>0) + read_reg_v2(0xFD, (buffer + j*8), r_byte_count); + else + read_reg_v2(table[i].cmd, buffer, r_byte_count); + + j++; + remain_bytes-=8; + } while(remain_bytes>0); + + printf("0x%02X[%02d] => { ", table[i].cmd, table[i].count); + for(k = 0; k < table[i].count; k++) + { + if((k % 4 ) == 0 && k > 0) + printf("\n ", buffer[k]); + printf("0x%02X ", buffer[k]); + } + printf("} \n"); + + } + } +#endif + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; +#if 0 + params->dsi.vertical_sync_active = 10; + params->dsi.vertical_backporch = 10; + params->dsi.vertical_frontporch = 10; // 2 + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 50; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; +#else + params->dsi.vertical_sync_active = 4; + params->dsi.vertical_backporch = 17; + params->dsi.vertical_frontporch = 17; // 2 + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 17; + params->dsi.horizontal_backporch = 49; + params->dsi.horizontal_frontporch = 57; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; +#endif + // Bit rate calculation + params->dsi.pll_div1=28; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + + +static void lcm_init(void) +{ + unsigned char buffer[10]; + unsigned int array[16]; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // AUO 3.17" + ILI9481 + + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); + send_data_cmd(0X0007); + send_data_cmd(0X0041); + send_data_cmd(0X001B); + + send_ctrl_cmd(0X00D1); + send_data_cmd(0X0000); + send_data_cmd(0X0016); // 0x001b + send_data_cmd(0X0012); + + send_ctrl_cmd(0X00D2); + send_data_cmd(0X0001); + send_data_cmd(0X0011); + + send_ctrl_cmd(0X00C0); + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X00F3); + send_data_cmd(0X0040); + send_data_cmd(0X000A); + send_ctrl_cmd(0X00F6); + send_data_cmd(0X0080); + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0080); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x29); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, +}; diff --git a/bq_aquaris77/lcm/ili9805_yashi/ili9805_yashi.c b/bq_aquaris77/lcm/ili9805_yashi/ili9805_yashi.c new file mode 100755 index 0000000..84bd46a --- /dev/null +++ b/bq_aquaris77/lcm/ili9805_yashi/ili9805_yashi.c @@ -0,0 +1,585 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xfd // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + {0xff, 3, {0xff, 0x98, 0x05}}, + {0xfd, 4, {0x03, 0x13, 0x44, 0x00}}, + {0xf8, 15, {0x18, +0x02, +0x02, +0x18, +0x02, +0x02, +0x30, +0x01, +0x01, +0x30, +0x01, +0x01, +0x30, +0x01, +0x01 +}}, +{0xb8, 1, {0x74}}, +{0xbb, 2, {0x14, 0x55}}, +{0xf1, 1, {0x00}}, +{0xf2, 3, {0x00, 0x58, 0x41}}, +{0xfc, 3, {0x04, 0x0f, 0x01}}, +{0xfe, 1, {0x19}}, +{REGFLAG_DELAY, 360, {}}, + +{0xeb, 2, {0x08, 0x0f}}, +{0xe0, 16, {0x00, +0x05, +0x12, +0x13, +0x13, +0x1b, +0x0f, +0x0f, +0x00, +0x09, +0x03, +0x0d, +0x0c, +0X2d, +0x29, +0x00 +}}, +{0xe1, 16, {0x00, +0x05, +0x12, +0x13, +0x14, +0x1b, +0x09, +0x07, +0x00, +0x03, +0x02, +0x0e, +0x0c, +0X2d, +0x29, +0x00 +}}, +{0xc1, 4, {0x13, 0x26, 0x06, 0x26}}, +{0xc7, 1, {0xb2}}, +{0xb1, 3, {0x00, 0x12, 0x14}}, +{0xb4, 1, {0x02}}, +{0x36, 1, {0x0a}}, +{0x3a, 1, {0x77}}, +{0x21, 0, {0x00}}, +{0xb0, 1, {0x00}}, +{0xb6, 1, {0x01}}, +{0xc2, 1, {0x11}}, +//************************************* +// TE On +//************************************* + {0x35, 1, {0x00}}, + //{0xb7, 2, {0x50,0x02}}, + //{REGFLAG_DELAY, 200, {}}, + //{0xbc, 2, {0x00,0x00}}, + //{0xbd, 2, {0x00,0x00}}, + //{0xbe, 2, {0x02,0x00}}, +//************************************* + // Sleep Out +//************************************* + {0x11, 0, {}}, + {REGFLAG_DELAY, 125, {}}, + //{0xb7, 2, {0x50,0x02}}, + //{REGFLAG_DELAY, 200, {}}, + //{0x2a, 4, {0x00,0x00,0x02,0x1b}}, + //{0x2b, 4, {0x00,0x00,0x03,0xbf}}, + //{0x36, 1, {0x00}}, + +//************************************* +// Display On + {0x29, 0, {}}, + {REGFLAG_DELAY, 20, {}}, + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 0, {0x00}}, + {REGFLAG_DELAY, 125, {}}, + + // Display ON + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + + // Display off sequence + {0x28, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + unsigned char lcd_id =0; + SET_RESET_PIN(1); + MDELAY(5); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(20); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[2]; + unsigned int array[16]; + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + unsigned char lcd_id = 0; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(50); + + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + read_reg_v2(0xF4, buffer, 2); + id = buffer[0]; //we only need ID + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + lcd_id = mt_get_gpio_in(GPIO_LCD_ID); +#if defined(BUILD_UBOOT) + printf("%s, zhaoshaopeng id = 0x%08x, lcd_id_det = %x\n", __func__, id, lcd_id); + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + if((id != 0x69))//this is not good + return 1; + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9805_yashi_lcm_drv = +{ + .name = "ili9805_yashi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/inc/lcm_drv.h b/bq_aquaris77/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..2b1eda7 --- /dev/null +++ b/bq_aquaris77/lcm/inc/lcm_drv.h @@ -0,0 +1,537 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), + LCM_DRIVING_CURRENT_6575_4MA = (1 << 4), + LCM_DRIVING_CURRENT_6575_8MA = (3 << 4), + LCM_DRIVING_CURRENT_6575_12MA = (2 << 4), + LCM_DRIVING_CURRENT_6575_16MA = (4 << 4) +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4, + LCM_DBI_DATA_WIDTH_32BITS = 5 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; + + +/* DSI related enumerations */ + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_DSI_FORMAT_RGB565 = 0, + LCM_DSI_FORMAT_RGB666 = 1, + LCM_DSI_FORMAT_RGB888 = 2 +} LCM_DSI_FORMAT; + + +typedef enum +{ + LCM_DSI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DSI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DSI_TRANS_SEQ; + + +typedef enum +{ + LCM_DSI_PADDING_ON_LSB = 0, + LCM_DSI_PADDING_ON_MSB = 1 +} LCM_DSI_PADDING; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +////////////////////////////////////MT6575 added params, and if lcm driver is for 6575, only care these below params + unsigned int css; + unsigned int csh; + unsigned int rd_1st; + unsigned int rd_2nd; + unsigned int wr_1st; + unsigned int wr_2nd; + + unsigned int sif_3wire; + unsigned int sif_sdi; + LCM_POLARITY sif_1st_pol; + LCM_POLARITY sif_sck_def; + unsigned int sif_div2; + unsigned int sif_hw_cs; +//////////////////////////////////// +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_hold; + unsigned int read_latency; + unsigned int wait_period; + /*only for 6575*/ + unsigned int cs_high_width; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DSI_TRANS_SEQ trans_seq; + LCM_DSI_PADDING padding; + LCM_DSI_FORMAT format; +} LCM_DSI_DATA_FORMAT; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + unsigned int i2x_en; + unsigned int i2x_edge; + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + + LCM_LANE_NUM LANE_NUM; + LCM_DSI_DATA_FORMAT data_format; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int packet_size; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int horizontal_sync_active; + unsigned int horizontal_backporch; + unsigned int horizontal_frontporch; + unsigned int horizontal_active_pixel; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; + + unsigned int lcm_int_te_monitor; + unsigned int lcm_int_te_period; + + unsigned int lcm_ext_te_monitor; + + unsigned int noncont_clock; + unsigned int noncont_clock_period; + +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq_V2)(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update); + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + unsigned int (*dsi_dcs_read_lcm_reg)(unsigned char cmd); + unsigned int (*dsi_dcs_read_lcm_reg_v2)(unsigned char cmd, unsigned char *buffer, unsigned char buffer_size); + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned char pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); +///////////////////////////CABC backlight related function + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + void (*set_backlight_mode)(unsigned int mode); +/////////////////////////// + +/////////////ESD_RECOVERY////////////////////// + unsigned int (*esd_check)(void); + unsigned int (*esd_recover)(void); + +///////////////////////////////////////////////// + +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/bq_aquaris77/lcm/lg4571/lg4571.c b/bq_aquaris77/lcm/lg4571/lg4571.c new file mode 100644 index 0000000..4244ee1 --- /dev/null +++ b/bq_aquaris77/lcm/lg4571/lg4571.c @@ -0,0 +1,366 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/bq_aquaris77/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c b/bq_aquaris77/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c new file mode 100644 index 0000000..2841d89 --- /dev/null +++ b/bq_aquaris77/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c @@ -0,0 +1,252 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#else +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + //SET_RESET_PIN(0); + //MDELAY(10); + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(50); + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + + +static void lcm_suspend(void) +{ + //SET_RESET_PIN(0); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ZERO); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + MDELAY(10); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + MDELAY(10); + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ZERO); // LCM_STBY + MDELAY(10); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST + MDELAY(10); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(50); + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE + MDELAY(120); // avoid LCD resume transint +} + +LCM_DRIVER lvds_wsvga_ti_lcm_drv = +{ + .name = "lvds_wsvga_ti", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/bq_aquaris77/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c b/bq_aquaris77/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c new file mode 100644 index 0000000..97e7c4e --- /dev/null +++ b/bq_aquaris77/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c @@ -0,0 +1,251 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#else +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + //SET_RESET_PIN(0); + //MDELAY(10); + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(120); + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + + +static void lcm_suspend(void) +{ + //SET_RESET_PIN(0); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ZERO); // HDMI_POWER_EN + + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + //MDELAY(10); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + MDELAY(10); + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ZERO); // LCM_STBY + MDELAY(10); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST + MDELAY(10); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(120); + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + +LCM_DRIVER lvds_wsvga_ti_n_lcm_drv = +{ + .name = "lvds_wsvga_ti_n", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/bq_aquaris77/lcm/mt65xx_lcm_list.c b/bq_aquaris77/lcm/mt65xx_lcm_list.c new file mode 100755 index 0000000..7f7dbf5 --- /dev/null +++ b/bq_aquaris77/lcm/mt65xx_lcm_list.c @@ -0,0 +1,240 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER hx8369_6575_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_hvga_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER nt35582_mcu_6575_lcm_drv; +extern LCM_DRIVER nt35582_rgb_6575_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_hvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_qvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369b_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER ha5266_lcm_drv; +extern LCM_DRIVER hsd070idw1_lcm_drv; +extern LCM_DRIVER lg4571_lcm_drv; +extern LCM_DRIVER lvds_wsvga_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_n_lcm_drv; +extern LCM_DRIVER nt35565_3d_lcm_drv; +extern LCM_DRIVER tm070ddh03_lcm_drv; +extern LCM_DRIVER r61408_lcm_drv; +extern LCM_DRIVER nt35510_lcm_drv; +extern LCM_DRIVER nt35510_hvga_lcm_drv; +extern LCM_DRIVER nt35510_qvga_lcm_drv; +extern LCM_DRIVER nt35510_6517_lcm_drv; +extern LCM_DRIVER r63303_idisplay_lcm_drv; + +//fenggy add +extern LCM_DRIVER hx8369_dsi_bld_lcm_drv; +extern LCM_DRIVER hx8369_dsi_tm_lcm_drv; +extern LCM_DRIVER nt35510_truly_lcm_drv; +extern LCM_DRIVER nt35510_chuangshi_lcm_drv; +//fenggy add end +//zhaoshaopeng add for GSI 20120627 +extern LCM_DRIVER nt35510_gsi_lcm_drv; +//zhaoshaopeng end +//zhaoshaopeng add for aq 20120704 start //zhaoshaopeng add truyl20120712 start for tianma orise 20120924 start +extern LCM_DRIVER nt35516_tm_lcm_drv; +extern LCM_DRIVER nt35516_truly_lcm_drv; +extern LCM_DRIVER otm9608a_tm_lcm_drv; +//zhaoshaopeng 20120708 //zhaoshaopeng add truyl20120712 end //zhaoshaopeng 0924 end +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(HX8369_6575) + &hx8369_6575_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(NT35582_MCU_6575) + &nt35582_mcu_6575_lcm_drv, +#endif + +#if defined(NT35582_RGB_6575) + &nt35582_rgb_6575_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(R61408) + &r61408_lcm_drv, +#endif + +#if defined(HX8369_DSI_VDO) + &hx8369_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI) + &hx8369_dsi_6575_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_HVGA) + &hx8369_dsi_6575_hvga_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_QVGA) + &hx8369_dsi_6575_qvga_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(NT35510) + &nt35510_lcm_drv, +#endif + +#if defined(NT35510_HVGA) + &nt35510_hvga_lcm_drv, +#endif + +#if defined(NT35510_QVGA) + &nt35510_qvga_lcm_drv, +#endif + +#if defined(NT35510_6517) + &nt35510_6517_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(HA5266) + &ha5266_lcm_drv, +#endif + +#if defined(HSD070IDW1) + &hsd070idw1_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI) + &hx8363_6575_dsi_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI_HVGA) + &hx8363_6575_dsi_hvga_lcm_drv, +#endif + +#if defined(LG4571) + &lg4571_lcm_drv, +#endif + +#if defined(LVDS_WSVGA) + &lvds_wsvga_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI) + &lvds_wsvga_ti_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI_N) + &lvds_wsvga_ti_n_lcm_drv, +#endif + +#if defined(NT35565_3D) + &nt35565_3d_lcm_drv, +#endif + +#if defined(TM070DDH03) + &tm070ddh03_lcm_drv, +#endif +#if defined(R63303_IDISPLAY) + &r63303_idisplay_lcm_drv, +#endif + +#if defined(HX8369B_DSI_VDO) + &hx8369b_dsi_vdo_lcm_drv, +#endif +//fenggy add +#if defined(HX8369_TM_DSI) + &hx8369_dsi_tm_lcm_drv, +#endif + +#if defined(HX8369_BLD_DSI) + &hx8369_dsi_bld_lcm_drv, +#endif + +#if defined(NT35510_TRULY) + &nt35510_truly_lcm_drv, +#endif +#if defined(NT35510_CHUANGSHI) + &nt35510_chuangshi_lcm_drv, +#endif + + +//fenggy add end +//zhaoshaopeng for gsi 20120627 start +#if defined(NT35510_GSI) + &nt35510_gsi_lcm_drv, +#endif +//zhaoshaopeng end +//zhaoshaopeng add for aq 20120704 start //zhaoshaopeng add truyl20120712 start //zhaoshaopeng 20120924 start +#if defined(NT35516_TM) + &nt35516_tm_lcm_drv, +#endif +#if defined(NT35516_TRULY) + &nt35516_truly_lcm_drv, +#endif + +#if defined(OTM9608A_TM) + &otm9608a_tm_lcm_drv, +#endif + +//zhaoshaopeng end//zhaoshaopeng add truyl20120712 end //zhaoshaopeng 20120924 end +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/bq_aquaris77/lcm/mtk_cust.mk b/bq_aquaris77/lcm/mtk_cust.mk new file mode 100755 index 0000000..c180615 --- /dev/null +++ b/bq_aquaris77/lcm/mtk_cust.mk @@ -0,0 +1,3 @@ +# Used for UBOOT +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/bq_aquaris77/lcm/nt35510/nt35510.c b/bq_aquaris77/lcm/nt35510/nt35510.c new file mode 100644 index 0000000..1c1754f --- /dev/null +++ b/bq_aquaris77/lcm/nt35510/nt35510.c @@ -0,0 +1,604 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Bit rate calculation + params->dsi.pll_div1=34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + params->dsi.HS_TRAIL = 10;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_ZERO = 8;//min 105ns+6*UI + params->dsi.HS_PRPR = 4;//min 40ns+4*UI; max 85ns+6UI + params->dsi.LPX = 12;//min 50ns + + params->dsi.TA_GO = 12;//4*LPX + + params->dsi.CLK_TRAIL = 5;//min 60ns + params->dsi.CLK_ZERO = 18;//min 300ns-38ns + params->dsi.LPX_WAIT = 10; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = 4;//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00053902; + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00123902; + data_array[1]=0x000201F8; + data_array[2]=0x00133320; + data_array[3]=0x23000040; + data_array[4]=0x00C89902; + data_array[5]=0x00001100; + dsi_set_cmdq(data_array, 6, 1); + + +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(data_array, 2, 1); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00B21500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(data_array, 2, 1); + + //data_array[0]=0x01BF1500; + //dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x242424BA; + dsi_set_cmdq(data_array, 2, 1); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(data_array, 2, 1); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(data_array, 1, 1); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(data_array, 1, 1); +// MDELAY(10); +/* + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(data_array, 1, 1); +*/ +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(10); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, %d\n", __func__, level); +#else + printk("lcm_setbacklight = %d\n", level); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + lcm_init(); + data_array[0]=0x00110500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0]=0x00290500; + dsi_set_cmdq(data_array, 1, 1); +} + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Bit rate calculation + params->dsi.pll_div1=34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + params->dsi.HS_TRAIL = 10;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_ZERO = 8;//min 105ns+6*UI + params->dsi.HS_PRPR = 4;//min 40ns+4*UI; max 85ns+6UI + params->dsi.LPX = 12;//min 50ns + + params->dsi.TA_GO = 12;//4*LPX + + params->dsi.CLK_TRAIL = 5;//min 60ns + params->dsi.CLK_ZERO = 18;//min 300ns-38ns + params->dsi.LPX_WAIT = 10; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = 4;//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + + +//AVDD: 5.0V + data_array[0]=0x00043902; + data_array[1]=0x0A0A0AB0; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x444444B6; + dsi_set_cmdq(data_array, 2, 1); + +//AVEE: -5.0V + data_array[0]=0x00043902; + data_array[1]=0x0A0A0AB1; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x343434B7; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x242424B9; + dsi_set_cmdq(data_array, 2, 1); + +//#VGLX:-13V + data_array[0]=0x00043902; + data_array[1]=0x080808B5; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x141414BA; + dsi_set_cmdq(data_array, 2, 1); + +//#VGMP:4.7V /VGSP:0V + data_array[0]=0x00043902; + data_array[1]=0x008800BC; + dsi_set_cmdq(data_array, 2, 1); + +//#VGMN:-4.7V /VGSN:0V + data_array[0]=0x00043902; + data_array[1]=0x008800BD; + dsi_set_cmdq(data_array, 2, 1); + +//##VCOM Setting + data_array[0]=0x00033902; + data_array[1]=0x002D00BE; + dsi_set_cmdq(data_array, 2, 1); + +//VCL + data_array[0]=0x00043902; + data_array[1]=0x020202B2; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x242424B8; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + +//# R+ + data_array[0]=0x00353902; + data_array[1]=0x002900D1; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FA02EF; + data_array[14]=0x00000060; + dsi_set_cmdq(data_array, 15, 1); + +//#G + + data_array[0]=0x00353902; + data_array[1]=0x002900D2; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FD02EF; + data_array[14]=0x00000000; + dsi_set_cmdq(data_array, 15, 1); + +//#B + + data_array[0]=0x00353902; + data_array[1]=0x002900D3; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x02F502EF; + data_array[14]=0x000000D0; + dsi_set_cmdq(data_array, 15, 1); + +//#R - + data_array[0]=0x00353902; + data_array[1]=0x002900D4; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FA02EF; + data_array[14]=0x00000060; + dsi_set_cmdq(data_array, 15, 1); + +//#G - + data_array[0]=0x00353902; + data_array[1]=0x002900D5; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FD02EF; + data_array[14]=0x00000000; + dsi_set_cmdq(data_array, 15, 1); + +//#B - + data_array[0]=0x00353902; + data_array[1]=0x002900D6; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x02F502EF; + data_array[14]=0x000000D0; + dsi_set_cmdq(data_array, 15, 1); +//####### ENABLE PAGE 0 ############ + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); +//################################### +//#Vivid Color + data_array[0]=0x10B41500; + dsi_set_cmdq(data_array, 1, 1); + +//#480*854 + data_array[0]=0x6CB51500; + dsi_set_cmdq(data_array, 1, 1); + +//#SDT + data_array[0]=0x05B61500; + dsi_set_cmdq(data_array, 1, 1); + +//#2dot-Inversion + data_array[0]=0x00043902; + data_array[1]=0x020202BC; + dsi_set_cmdq(data_array, 2, 1); + +//#Display option control-> video mode + data_array[0]=0x00033902; + data_array[1]=0x0000D4B1; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00063902; + data_array[1]=0x500200C9; + data_array[2]=0x00005050; + dsi_set_cmdq(data_array, 3, 1); + +//#Gate EQ for rising edge + data_array[0]=0x00033902; + data_array[1]=0x008080B7; + dsi_set_cmdq(data_array, 2, 1); + +//#Source EQ + data_array[0]=0x00053902; + data_array[1]=0x070701B8; + data_array[2]=0x00000007; + dsi_set_cmdq(data_array, 3, 1); + data_array[0]=0x00053902; + data_array[1]=0x0100002A; + data_array[2]=0x000000DF; + dsi_set_cmdq(data_array, 3, 1); + data_array[0]=0x00053902; + data_array[1]=0x0300002B; + data_array[2]=0x00000055; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00351500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0055; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(data_array, 2, 1); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(10); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, lcm_setbacklight level=%d\n", __func__,level); + MDELAY(50); +#else + printk("lcm_setbacklight level=%d\n",level); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + lcm_init(); + data_array[0]=0x00110500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0]=0x00290500; + dsi_set_cmdq(data_array, 1, 1); +} + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + +//************************************* +// Select CMD2,Page 1 +//************************************* + {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x01}}, + + //{REGFLAG_DELAY, 10, {}}, +// AVDD: 6.0V + {0xb0, 3, {0x0d, 0x0d, 0x0d}}, +// AVEE: -6.0V + {0xb1, 3, {0x0d, 0x0d, 0x0d}}, + {0xb2, 3, {0x00, 0x00, 0x00}}, +// AVDD: 2.5x VPNL + {0xb6, 3, {0x44, 0x44, 0x44}}, + {0xb7, 3, {0x34, 0x34, 0x34}}, + {0xb8, 3, {0x34, 0x34, 0x34}}, + {0xbf, 1, {0x01}}, + + {0xb3, 3, {0x0f, 0x0f, 0x0f}}, + {0xb9, 3, {0x34, 0x34, 0x34}}, + {0xb5, 3, {0x08, 0x08, 0x08}}, + {0xc2, 1, {0x03}}, + {0xba, 3, {0x34, 0x34, 0x34}}, + {0xbc, 3, {0x00, 0x78, 0x00}}, + {0xbd, 3, {0x00, 0x78, 0x00}}, + {0xbe, 2, {0x00,0x5f}}, +//************************************* +// Gamma Code +//************************************* +// Positive Red Gamma + + {0xd1, 52, {0x00, +0x33, +0x00, +0x34, +0x00, +0x3A, +0x00, +0x4A, +0x00, +0x5C, +0x00, +0x81, +0x00, +0xA6, +0x00, +0xE5, +0x01, +0x13, +0x01, +0x54, +0x01, +0x82, +0x01, +0xCA, +0x02, +0x00, +0x02, +0x01, +0x02, +0x34, +0x02, +0x67, +0x02, +0x84, +0x02, +0xA4, +0x02, +0xB7, +0x02, +0xCF, +0x02, +0xDE, +0x02, +0xF2, +0x02, +0xFE, +0x03, +0x10, +0x03, +0x33, +0x03, +0x6D, +}}, + + {0xd2, 52, {0x00, +0x33, +0x00, +0x34, +0x00, +0x3A, +0x00, +0x4A, +0x00, +0x5C, +0x00, +0x81, +0x00, +0xA6, +0x00, +0xE5, +0x01, +0x13, +0x01, +0x54, +0x01, +0x82, +0x01, +0xCA, +0x02, +0x00, +0x02, +0x01, +0x02, +0x34, +0x02, +0x67, +0x02, +0x84, +0x02, +0xA4, +0x02, +0xB7, +0x02, +0xCF, +0x02, +0xDE, +0x02, +0xF2, +0x02, +0xFE, +0x03, +0x10, +0x03, +0x33, +0x03, +0x6D, +}}, + + {0xd3, 52, {0x00, +0x33, +0x00, +0x34, +0x00, +0x3A, +0x00, +0x4A, +0x00, +0x5C, +0x00, +0x81, +0x00, +0xA6, +0x00, +0xE5, +0x01, +0x13, +0x01, +0x54, +0x01, +0x82, +0x01, +0xCA, +0x02, +0x00, +0x02, +0x01, +0x02, +0x34, +0x02, +0x67, +0x02, +0x84, +0x02, +0xA4, +0x02, +0xB7, +0x02, +0xCF, +0x02, +0xDE, +0x02, +0xF2, +0x02, +0xFE, +0x03, +0x10, +0x03, +0x33, +0x03, +0x6D, +}}, + + {0xd4, 52, {0x00, +0x33, +0x00, +0x34, +0x00, +0x3A, +0x00, +0x4A, +0x00, +0x5C, +0x00, +0x81, +0x00, +0xA6, +0x00, +0xE5, +0x01, +0x13, +0x01, +0x54, +0x01, +0x82, +0x01, +0xCA, +0x02, +0x00, +0x02, +0x01, +0x02, +0x34, +0x02, +0x67, +0x02, +0x84, +0x02, +0xA4, +0x02, +0xB7, +0x02, +0xCF, +0x02, +0xDE, +0x02, +0xF2, +0x02, +0xFE, +0x03, +0x10, +0x03, +0x33, +0x03, +0x6D, +}}, + + {0xd5, 52, {0x00, +0x33, +0x00, +0x34, +0x00, +0x3A, +0x00, +0x4A, +0x00, +0x5C, +0x00, +0x81, +0x00, +0xA6, +0x00, +0xE5, +0x01, +0x13, +0x01, +0x54, +0x01, +0x82, +0x01, +0xCA, +0x02, +0x00, +0x02, +0x01, +0x02, +0x34, +0x02, +0x67, +0x02, +0x84, +0x02, +0xA4, +0x02, +0xB7, +0x02, +0xCF, +0x02, +0xDE, +0x02, +0xF2, +0x02, +0xFE, +0x03, +0x10, +0x03, +0x33, +0x03, +0x6D, +}}, + + {0xd6, 52, {0x00, +0x33, +0x00, +0x34, +0x00, +0x3A, +0x00, +0x4A, +0x00, +0x5C, +0x00, +0x81, +0x00, +0xA6, +0x00, +0xE5, +0x01, +0x13, +0x01, +0x54, +0x01, +0x82, +0x01, +0xCA, +0x02, +0x00, +0x02, +0x01, +0x02, +0x34, +0x02, +0x67, +0x02, +0x84, +0x02, +0xA4, +0x02, +0xB7, +0x02, +0xCF, +0x02, +0xDE, +0x02, +0xF2, +0x02, +0xFE, +0x03, +0x10, +0x03, +0x33, +0x03, +0x6D, +}}, + + + {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x00}}, + {0xb5, 1, {0x50}}, + {0xb1, 2, {0xcc, 0x00}},//from fc + {0xb6, 1, {0x05}}, + {0xb7, 2, {0x77, 0x77}}, + {0xb8, 3, {0x01,0x03,0x03}}, + {0xbc, 3, {0x02, 0x00, 0x00}}, + {0xbd, 5, {0x01, 0x84, 0x1c, 0x1c, 0x00}}, + {0xc9, 5, {0xD0, 0x02, 0x50, 0x50, 0x50}}, + {0x36, 1, {0x00}}, + {0x35, 1, {0x00}}, + + {0x21, 0, {0x00}},//zhaoshaopeng add + +//************************************* +// Sleep Out +//************************************* + {0x11, 0, {}}, + +// {REGFLAG_DELAY, 200, {}}, + {REGFLAG_DELAY, 50, {}}, +//************************************* +// Display On +//************************************* + + {0x29, 0, {}}, + + {REGFLAG_DELAY, 200, {}}, + + + // Note + + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + // Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, +// {REGFLAG_DELAY, 200, {}}, + {REGFLAG_DELAY, 50, {}}, + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} + +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + + memset(params, 0, sizeof(LCM_PARAMS)); + params->type = LCM_TYPE_DSI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + + // DSI + + /* Command mode setting */ + + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + + // Not support in MT6573 + params->dsi.packet_size=256; + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + #if 1//zhaoshaopeng old + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz)zhaoshaopeng from 38 + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + #else + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + params->dsi.line_byte=2180; // 2256 = 752*3 + + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + + + // Bit rate calculation + + params->dsi.pll_div1=0x1a;//38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz)zhaoshaopeng from 38 + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + #endif +} + + +static void lcm_init(void) +{ + + unsigned char lcd_id =0; + SET_RESET_PIN(1); + MDELAY(1 ); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(100); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +} + +#ifndef BUILD_UBOOT +ulong bk_on=0; +#endif +static void lcm_suspend(void) +{ + #if 1 + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + #else + char null = 0; + dsi_set_cmdq_V2(0x28, 1, &null, 1); + MDELAY(200); + dsi_set_cmdq_V2(0x10, 1, &null, 1); + MDELAY(200); + //SET_RESET_PIN(0); + //dsi_set_cmdq_V2(0x78, 1, &null, 1); + //MDELAY(1); + //SET_RESET_PIN(1); + #endif + +#ifndef BUILD_UBOOT + set_bit(1,&bk_on); +#endif + + +} + + +static void lcm_resume(void) +{ + //lcm_init(); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned char lcd_id = 0; + lcd_id = mt_get_gpio_in(GPIO_LCD_ID); +#if defined(BUILD_UBOOT) + printf("%s, zhaoshaopeng lcd_id_det = %x\n", __func__, lcd_id); +#endif + if(lcd_id ==1) + return 1; + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35510_chuangshi_lcm_drv = +{ + .name = "nt35510_chuangshi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/nt35510_hvga/nt35510_hvga.c b/bq_aquaris77/lcm/nt35510_hvga/nt35510_hvga.c new file mode 100644 index 0000000..c4ded5b --- /dev/null +++ b/bq_aquaris77/lcm/nt35510_hvga/nt35510_hvga.c @@ -0,0 +1,680 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +/*Begin lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) +/*End lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + unsigned int div2_real=0; + unsigned int cycle_time = 0; + unsigned int ui = 0; + unsigned int hs_trail_m, hs_trail_n; + #define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + div2_real=params->dsi.pll_div2 ? params->dsi.pll_div2*0x02 : 0x1; + cycle_time = (8 * 1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)); + ui = (1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)) + 1; + + hs_trail_m=params->dsi.LANE_NUM; + hs_trail_n=NS_TO_CYCLE(((params->dsi.LANE_NUM * 4 * ui) + 60), cycle_time); + +// params->dsi.HS_TRAIL = ((hs_trail_m > hs_trail_n) ? hs_trail_m : hs_trail_n) + 3;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_TRAIL = 20; + params->dsi.HS_ZERO = NS_TO_CYCLE((115 + 6 * ui), cycle_time);//min 105ns+6*UI + params->dsi.HS_PRPR = NS_TO_CYCLE((50 + 4 * ui), cycle_time);//min 40ns+4*UI; max 85ns+6UI + // HS_PRPR can't be 1. + if (params->dsi.HS_PRPR < 2) + params->dsi.HS_PRPR = 2; + + params->dsi.LPX = NS_TO_CYCLE(200, cycle_time);//min 50ns + + params->dsi.TA_SACK = 1; + params->dsi.TA_GET = 5 * params->dsi.LPX;//5*LPX + params->dsi.TA_SURE = 3 * params->dsi.LPX / 2;//min LPX; max 2*LPX; + params->dsi.TA_GO = 4 * params->dsi.LPX;//4*LPX + + params->dsi.CLK_TRAIL = NS_TO_CYCLE(70, cycle_time);//min 60ns + // CLK_TRAIL can't be 1. + if (params->dsi.CLK_TRAIL < 2) + params->dsi.CLK_TRAIL = 2; + params->dsi.CLK_ZERO = NS_TO_CYCLE((300), cycle_time);//min 300ns-38ns + params->dsi.LPX_WAIT = 1; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = NS_TO_CYCLE((38 + 95) / 2, cycle_time);//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00B21500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x01BF1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x343434BA; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(&data_array, 1, 1); +// MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(200); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + + data_array[0] = 0x002C0500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00110500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); + + data_array[0]=0x00290500; + dsi_set_cmdq(&data_array, 1, 1); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, \n", __func__); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(&data_array, 2, 1); +} + + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +/*Begin lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) +/*End lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + unsigned int div2_real=0; + unsigned int cycle_time = 0; + unsigned int ui = 0; + unsigned int hs_trail_m, hs_trail_n; + #define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + div2_real=params->dsi.pll_div2 ? params->dsi.pll_div2*0x02 : 0x1; + cycle_time = (8 * 1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)); + ui = (1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)) + 1; + + hs_trail_m=params->dsi.LANE_NUM; + hs_trail_n=NS_TO_CYCLE(((params->dsi.LANE_NUM * 4 * ui) + 60), cycle_time); + +// params->dsi.HS_TRAIL = ((hs_trail_m > hs_trail_n) ? hs_trail_m : hs_trail_n) + 3;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_TRAIL = 20; + params->dsi.HS_ZERO = NS_TO_CYCLE((115 + 6 * ui), cycle_time);//min 105ns+6*UI + params->dsi.HS_PRPR = NS_TO_CYCLE((50 + 4 * ui), cycle_time);//min 40ns+4*UI; max 85ns+6UI + // HS_PRPR can't be 1. + if (params->dsi.HS_PRPR < 2) + params->dsi.HS_PRPR = 2; + + params->dsi.LPX = NS_TO_CYCLE(200, cycle_time);//min 50ns + + params->dsi.TA_SACK = 1; + params->dsi.TA_GET = 5 * params->dsi.LPX;//5*LPX + params->dsi.TA_SURE = 3 * params->dsi.LPX / 2;//min LPX; max 2*LPX; + params->dsi.TA_GO = 4 * params->dsi.LPX;//4*LPX + + params->dsi.CLK_TRAIL = NS_TO_CYCLE(70, cycle_time);//min 60ns + // CLK_TRAIL can't be 1. + if (params->dsi.CLK_TRAIL < 2) + params->dsi.CLK_TRAIL = 2; + params->dsi.CLK_ZERO = NS_TO_CYCLE((300), cycle_time);//min 300ns-38ns + params->dsi.LPX_WAIT = 1; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = NS_TO_CYCLE((38 + 95) / 2, cycle_time);//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00B21500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x01BF1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x343434BA; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(&data_array, 1, 1); +// MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(200); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + + data_array[0] = 0x002C0500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00110500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); + + data_array[0]=0x00290500; + dsi_set_cmdq(&data_array, 1, 1); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, \n", __func__); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(&data_array, 2, 1); +} + + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, +//************************************* +// Select CMD2,Page 0 +//************************************* + //{0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x00}}, +// Source EQ + //{0xb8, 4, {0x01, 0x02, 0x02, 0x02}}, +// Z Inversion + // {0xbc, 3, {0x02, 0x02, 0x02}}, + // {REGFLAG_DELAY, 10, {}}, + +//************************************* +// Select CMD2,Page 1 +//************************************* + {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x01}}, + + //{REGFLAG_DELAY, 10, {}}, +// AVDD: 6.0V + //{0xb0, 3, {0x05, 0x05, 0x05}}, +// AVEE: -6.0V + //{0xb1, 3, {0x05, 0x05, 0x05}}, +// AVDD: 2.5x VPNL + // {0xb6, 3, {0x44, 0x44, 0x44}}, + +//************************************* +// Gamma Code +//************************************* +// Positive Red Gamma + + {0xd1, 52, {0x00,0x33,0x00,0x34,0x00,0x3a,0x00,0x4a,0x00,0x5c,0x00,0x81,0x00,0xa6,0x00,0xe5, + 0x01,0x13,0x01,0x54,0x01,0x82,0x01,0xca,0x02,0x00,0x02,0x01,0x02,0x34,0x02,0x67, + 0x02,0x84,0x02,0xa4,0x02,0xb7,0x02,0xcf,0x02,0xde,0x02,0xf2,0x02,0xfe,0x03,0x10, + 0x03,0x33,0x03,0x6d}}, + + {0xd2, 52, {0x00,0x33,0x00,0x34,0x00,0x3a,0x00,0x4a,0x00,0x5c,0x00,0x81,0x00,0xa6,0x00,0xe5, + 0x01,0x13,0x01,0x54,0x01,0x82,0x01,0xca,0x02,0x00,0x02,0x01,0x02,0x34,0x02,0x67, + 0x02,0x84,0x02,0xa4,0x02,0xb7,0x02,0xcf,0x02,0xde,0x02,0xf2,0x02,0xfe,0x03,0x10, + 0x03,0x33,0x03,0x6d}}, + + {0xd3, 52, {0x00,0x33,0x00,0x34,0x00,0x3a,0x00,0x4a,0x00,0x5c,0x00,0x81,0x00,0xa6,0x00,0xe5, + 0x01,0x13,0x01,0x54,0x01,0x82,0x01,0xca,0x02,0x00,0x02,0x01,0x02,0x34,0x02,0x67, + 0x02,0x84,0x02,0xa4,0x02,0xb7,0x02,0xcf,0x02,0xde,0x02,0xf2,0x02,0xfe,0x03,0x10, + 0x03,0x33,0x03,0x6d}}, + + {0xd4, 52, {0x00,0x33,0x00,0x34,0x00,0x3a,0x00,0x4a,0x00,0x5c,0x00,0x81,0x00,0xa6,0x00,0xe5, + 0x01,0x13,0x01,0x54,0x01,0x82,0x01,0xca,0x02,0x00,0x02,0x01,0x02,0x34,0x02,0x67, + 0x02,0x84,0x02,0xa4,0x02,0xb7,0x02,0xcf,0x02,0xde,0x02,0xf2,0x02,0xfe,0x03,0x10, + 0x03,0x33,0x03,0x6d}}, + + {0xd5, 52, {0x00,0x33,0x00,0x34,0x00,0x3a,0x00,0x4a,0x00,0x5c,0x00,0x81,0x00,0xa6,0x00,0xe5, + 0x01,0x13,0x01,0x54,0x01,0x82,0x01,0xca,0x02,0x00,0x02,0x01,0x02,0x34,0x02,0x67, + 0x02,0x84,0x02,0xa4,0x02,0xb7,0x02,0xcf,0x02,0xde,0x02,0xf2,0x02,0xfe,0x03,0x10, + 0x03,0x33,0x03,0x6d}}, + + {0xd6, 52, {0x00,0x33,0x00,0x34,0x00,0x3a,0x00,0x4a,0x00,0x5c,0x00,0x81,0x00,0xa6,0x00,0xe5, + 0x01,0x13,0x01,0x54,0x01,0x82,0x01,0xca,0x02,0x00,0x02,0x01,0x02,0x34,0x02,0x67, + 0x02,0x84,0x02,0xa4,0x02,0xb7,0x02,0xcf,0x02,0xde,0x02,0xf2,0x02,0xfe,0x03,0x10, + 0x03,0x33,0x03,0x6d}}, + + +// AVEE: -2.5x VPNL + {0xb9, 3, {0x34, 0x34, 0x34}}, +// VGLX: AVEE - AVDD + VCL + {0xba, 3, {0x14, 0x14, 0x14}},//zhaoshaopeng from 0x34 + +// VGMP: 4.7V,VGSP=0V + {0xbc, 3, {0x00, 0x78, 0x00}}, +// VGMN: -4.7V,VGSN=-0V + {0xbd, 3, {0x00, 0x78, 0x00}}, +// VCOM + {0xbe, 2, {0x00, 0x64}}, + + {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x00}}, + + {0xb1, 2, {0xcc, 0x00}},//from fc + {0xbc, 3, {0x01, 0x00, 0x00}}, + +//************************************* +// Sleep Out +//************************************* + {0x11, 0, {}}, + +// {REGFLAG_DELAY, 200, {}}, + {REGFLAG_DELAY, 50, {}}, +//************************************* +// Display On +//************************************* + + {0x29, 0, {}}, + + {REGFLAG_DELAY, 200, {}}, + + + // Note + + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + // Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, +// {REGFLAG_DELAY, 200, {}}, + {REGFLAG_DELAY, 50, {}}, + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} + +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + + memset(params, 0, sizeof(LCM_PARAMS)); + params->type = LCM_TYPE_DSI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + + // DSI + + /* Command mode setting */ + + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + + // Not support in MT6573 + params->dsi.packet_size=256; + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + #if 1//zhaoshaopeng old + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz)zhaoshaopeng from 38 + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + #else + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + params->dsi.line_byte=2180; // 2256 = 752*3 + + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + + + // Bit rate calculation + + params->dsi.pll_div1=0x1a;//38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz)zhaoshaopeng from 38 + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + #endif +} + + +static void lcm_init(void) +{ + + unsigned char lcd_id =0; + SET_RESET_PIN(1); + MDELAY(1 ); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(100); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +#ifndef BUILD_UBOOT +extern ulong bk_on; +#endif +static void lcm_suspend(void) +{ + #if 1 + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + #else + char null = 0; + dsi_set_cmdq_V2(0x28, 1, &null, 1); + MDELAY(200); + dsi_set_cmdq_V2(0x10, 1, &null, 1); + MDELAY(200); + //SET_RESET_PIN(0); + //dsi_set_cmdq_V2(0x78, 1, &null, 1); + //MDELAY(1); + //SET_RESET_PIN(1); + #endif +#ifndef BUILD_UBOOT + set_bit(1,&bk_on); +#endif +} + +static void lcm_resume(void) +{ + //lcm_init(); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned char lcd_id = 0; + lcd_id = mt_get_gpio_in(GPIO_LCD_ID); +#if defined(BUILD_UBOOT) + printf("%s, zhaoshaopeng , lcd_id_det = %x\n", __func__, lcd_id); +#endif + if(lcd_id ==0) + return 1; + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35510_truly_lcm_drv = +{ + .name = "nt35510_truly", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/nt35516_tm/nt35516_tm.c b/bq_aquaris77/lcm/nt35516_tm/nt35516_tm.c new file mode 100755 index 0000000..c3cb1c2 --- /dev/null +++ b/bq_aquaris77/lcm/nt35516_tm/nt35516_tm.c @@ -0,0 +1,1436 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xfd // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +#if 0 +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + /* + {0xff, 5, {0xaa, 0x55, 0x25, 0x01, 0x01}}, + {0xf2, 35, {0x00, +0x00, +0x4A, +0x0A, +0xA8, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x0B, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x40, +0x01, +0x51, +0x00, +0x01, +0x00, +0x01 +}}, + {0xf3, 7, {0x02, +0x03, +0x07, +0x45, +0x88, +0xD1, +0x0D +}}, +*/ +//************************************* +// Select CMD2,Page 0 +//************************************* + {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x00}}, + {0xb0, 5, {0x00, 0x0c, 0x40, 0x3c, 0x3c}}, + + {0x4c, 1, {0x10}}, + {0xb1, 3, {0x71, 0x06, 0x00}}, + {0xb6, 1, {0x00}}, + {0xb7, 2, {0xff,0x55}}, + + + {0xbc, 2, {0x00, 0x00}}, + + //{0xb8, 4, {0x01, 0x02, 0x02, 0x02}}, + {0xc9, 6, {0x41, 0x06, 0x0d, 0x3a, 0x17, 0x00}}, + {REGFLAG_DELAY, 10, {}}, +//************************************* +// Select CMD2,Page 1 +//************************************* + {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x01}}, + {REGFLAG_DELAY, 10, {}}, +// AVDD: 6.0V + //{0xb0, 3, {0x05, 0x05, 0x05}}, +// AVEE: -6.0V + //{0xb1, 3, {0x05, 0x05, 0x05}}, + //{0xb2, 3, {0x01, 0x01, 0x01}}, + //{0xb3, 3, {0x0e, 0x0e, 0x0e}}, + //{0xb4, 3, {0x08, 0x08, 0x08}}, + + //{0xb6, 3, {0x44, 0x44, 0x44}}, + + //{0xb7, 3, {0x34, 0x34, 0x34}}, + //{0xb8, 3, {0x10, 0x10, 0x10}}, + //{0xb9, 3, {0x26, 0x26, 0x26}}, + + //{0xba, 3, {0x34, 0x34, 0x34}}, + + //{0xbc, 3, {0x00, 0xc8, 0x00}}, + + //{0xbd, 3, {0x00, 0xc8, 0x00}}, +// VCOM + //{0xbe, 1, {0x73}}, + //{0xc0, 2, {0x04, 0x00}}, + //{0xca, 1, {0x00}}, + //{0xd0, 4, {0x0a, 0x10, 0x0d, 0x0f}}, + +//************************************* +// Gamma Code +//************************************* +// Positive Red Gamma + {0xd1, 16, {0x00, +0x00, +0x00, +0x29, +0x00, +0x62, +0x00, +0x86, +0x00, +0xA7, +0x00, +0xD3, +0x00, +0xF3, +0x01, +0x27 +}}, + {0xd2, 16, {0x01, +0x52, +0x01, +0x91, +0x01, +0xC1, +0x02, +0x12, +0x02, +0x4D, +0x02, +0x4F, +0x02, +0x86, +0x02, +0xC5 +}}, + {0xd3, 16, {0x02, +0xE4, +0x03, +0x14, +0x03, +0x2E, +0x03, +0x58, +0x03, +0x6E, +0x03, +0x93, +0x03, +0xA7, +0x03, +0xC3 +}}, + {0xd4, 4, {0x03, 0xf8, 0x03, 0xf8}}, +// Positive Green Gamma + {0xd5, 16, {0x00, +0x00, +0x00, +0x29, +0x00, +0x62, +0x00, +0x86, +0x00, +0xA7, +0x00, +0xD3, +0x00, +0xF3, +0x01, +0x27 +}}, + {0xd6, 16, {0x01, +0x52, +0x01, +0x91, +0x01, +0xC1, +0x02, +0x12, +0x02, +0x4D, +0x02, +0x4F, +0x02, +0x86, +0x02, +0xC5 +}}, + {0xd7, 16, {0x02, +0xE4, +0x03, +0x14, +0x03, +0x2E, +0x03, +0x58, +0x03, +0x6E, +0x03, +0x93, +0x03, +0xA7, +0x03, +0xC3 +}}, + {0xd8, 4, {0x03, 0xf8, 0x03, 0xf8}}, +// Positive Blue Gamma + {0xd9, 16, {0x00, +0x00, +0x00, +0x29, +0x00, +0x62, +0x00, +0x86, +0x00, +0xA7, +0x00, +0xD3, +0x00, +0xF3, +0x01, +0x27 +}}, + {0xdd, 16, {0x01, +0x52, +0x01, +0x91, +0x01, +0xC1, +0x02, +0x12, +0x02, +0x4D, +0x02, +0x4F, +0x02, +0x86, +0x02, +0xC5 +}}, + {0xde, 16, {0x02, +0xE4, +0x03, +0x14, +0x03, +0x2E, +0x03, +0x58, +0x03, +0x6E, +0x03, +0x93, +0x03, +0xA7, +0x03, +0xC3 +}}, + {0xdf, 4, {0x03,0xf8,0x03,0xf8}}, +// Negative Red Gamma + {0xe0, 16, {0x00, +0x00, +0x00, +0x29, +0x00, +0x62, +0x00, +0x86, +0x00, +0xA7, +0x00, +0xD3, +0x00, +0xF3, +0x01, +0x27 +}}, + {0xe1, 16, {0x01, +0x52, +0x01, +0x91, +0x01, +0xC1, +0x02, +0x12, +0x02, +0x4D, +0x02, +0x4F, +0x02, +0x86, +0x02, +0xC5 +}}, + {0xe2, 16, {0x02, +0xE4, +0x03, +0x14, +0x03, +0x2E, +0x03, +0x58, +0x03, +0x6E, +0x03, +0x93, +0x03, +0xA7, +0x03, +0xC3 +}}, + {0xe3, 4, {0x03,0xf8,0x03,0xf8}}, +// Negative Green Gamma + {0xe4, 16, {0x00, +0x00, +0x00, +0x29, +0x00, +0x62, +0x00, +0x86, +0x00, +0xA7, +0x00, +0xD3, +0x00, +0xF3, +0x01, +0x27 +}}, + {0xe5, 16, {0x01, +0x52, +0x01, +0x91, +0x01, +0xC1, +0x02, +0x12, +0x02, +0x4D, +0x02, +0x4F, +0x02, +0x86, +0x02, +0xC5 +}}, + {0xe6, 16, {0x02, +0xE4, +0x03, +0x14, +0x03, +0x2E, +0x03, +0x58, +0x03, +0x6E, +0x03, +0x93, +0x03, +0xA7, +0x03, +0xC3 +}}, + {0xe7, 4, {0x03,0xf8,0x03,0xf8}}, +// Negative Blue Gamma + {0xe8, 16, {0x00, +0x00, +0x00, +0x29, +0x00, +0x62, +0x00, +0x86, +0x00, +0xA7, +0x00, +0xD3, +0x00, +0xF3, +0x01, +0x27 +}}, + {0xe9, 16, {0x01, +0x52, +0x01, +0x91, +0x01, +0xC1, +0x02, +0x12, +0x02, +0x4D, +0x02, +0x4F, +0x02, +0x86, +0x02, +0xC5 +}}, + {0xea, 16, {0x02, +0xE4, +0x03, +0x14, +0x03, +0x2E, +0x03, +0x58, +0x03, +0x6E, +0x03, +0x93, +0x03, +0xA7, +0x03, +0xC3 +}}, + + {0xeb, 4, {0x03,0xf8,0x03,0xf8}}, + {0xb0, 1, {0x0a}}, + {0xb6, 1, {0x34}}, + {0xb1, 1, {0x0a}}, + {0xb7, 1, {0x24}}, + {0xb2, 1, {0x00}}, + {0xb8, 1, {0x30}}, + {0xb3, 1, {0x0a}}, + + {0xb9, 1, {0x24}}, + {0xb4, 1, {0x0a}}, + {0xba, 1, {0x34}}, + + + + {0xbc, 3, {0x00,0x78,0x00}}, + {0xbd, 3, {0x00,0x78,0x00}}, + {0xbe, 1, {0x44}}, + {0xc2, 1, {0x00}}, + {0x35, 1, {0x00}}, + {0x36, 1, {0xc0}},//zhaoshaopeng add for tm +//************************************* + // Sleep Out +//************************************* + {0x11, 0, {}}, + {REGFLAG_DELAY, 200, {}}, +//************************************* +// Display On +//************************************* + {0x29, 0, {}}, + {REGFLAG_DELAY, 200, {}}, + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#else +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + /* + {0xff, 5, {0xaa, 0x55, 0x25, 0x01, 0x01}}, + {0xf2, 35, {0x00, +0x00, +0x4A, +0x0A, +0xA8, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x0B, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x40, +0x01, +0x51, +0x00, +0x01, +0x00, +0x01 +}}, + {0xf3, 7, {0x02, +0x03, +0x07, +0x45, +0x88, +0xD1, +0x0D +}}, +*/ +//************************************* +// Select CMD2,Page 0 +//************************************* + {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x00}}, + + {0x4c, 1, {0x10}}, + {0xb1, 3, {0x71, 0x00, 0x00}}, + {0xb6, 1, {0x00}}, + {0xb7, 2, {0xff,0x55}}, + + + {0xbc, 3, {0x00,0x00,0x00}}, + + //{0xb8, 4, {0x01, 0x02, 0x02, 0x02}}, + {0xc9, 6, {0x41, 0x06, 0x0d, 0x3a, 0x17, 0x00}}, + {REGFLAG_DELAY, 10, {}}, +//************************************* +// Select CMD2,Page 1 +//************************************* + {0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x01}}, + {REGFLAG_DELAY, 10, {}}, +//add for different gamma + {0xd0, 4, {0x0a,0x10,0x0d, 0x0f}}, + +//************************************* +// Gamma Code +//************************************* +// Positive Red Gamma + {0xd1, 16, {0x00, +0x00, +0x00, +0x60, +0x00, +0xbb, +0x00, +0xf8, +0x01, +0x1a, +0x01, +0x43, +0x01, +0x61, +0x01, +0x91 +}}, + {0xd2, 16, {0x01, +0xb5, +0x01, +0xee, +0x02, +0x1a, +0x02, +0x5e, +0x02, +0x94, +0x02, +0x95, +0x02, +0xc5, +0x02, +0xf9 +}}, + {0xd3, 16, {0x03, +0x19, +0x03, +0x44, +0x03, +0x5f, +0x03, +0x81, +0x03, +0x95, +0x03, +0xAf, +0x03, +0xba, +0x03, +0xc5 +}}, + {0xd4, 4, {0x03,0xd0,0x03,0xd8}}, +// Positive Green Gamma + {0xd5, 16, {0x00, +0x00, +0x00, +0x60, +0x00, +0xbb, +0x00, +0xf8, +0x01, +0x1a, +0x01, +0x43, +0x01, +0x61, +0x01, +0x91 +}}, + {0xd6, 16, {0x01, +0xb5, +0x01, +0xee, +0x02, +0x1a, +0x02, +0x5e, +0x02, +0x94, +0x02, +0x95, +0x02, +0xc5, +0x02, +0xf9 +}}, + {0xd7, 16, {0x03, +0x19, +0x03, +0x44, +0x03, +0x5f, +0x03, +0x81, +0x03, +0x95, +0x03, +0xAf, +0x03, +0xba, +0x03, +0xc5 +}}, + {0xd8, 4, {0x03,0xd0,0x03,0xd8}}, +// Positive Blue Gamma + {0xd9, 16, {0x00, +0x00, +0x00, +0x60, +0x00, +0xbb, +0x00, +0xf8, +0x01, +0x1a, +0x01, +0x43, +0x01, +0x61, +0x01, +0x91 +}}, + {0xdd, 16, {0x01, +0xb5, +0x01, +0xee, +0x02, +0x1a, +0x02, +0x5e, +0x02, +0x94, +0x02, +0x95, +0x02, +0xc5, +0x02, +0xf9 +}}, + {0xde, 16, {0x03, +0x19, +0x03, +0x44, +0x03, +0x5f, +0x03, +0x81, +0x03, +0x95, +0x03, +0xAf, +0x03, +0xba, +0x03, +0xc5 +}}, + {0xdf, 4, {0x03,0xd0,0x03,0xd8}}, +// Negative Red Gamma + {0xe0, 16, {0x00, +0x00, +0x00, +0x60, +0x00, +0xbb, +0x00, +0xf8, +0x01, +0x1a, +0x01, +0x43, +0x01, +0x61, +0x01, +0x91 +}}, + {0xe1, 16, {0x01, +0xb5, +0x01, +0xee, +0x02, +0x1a, +0x02, +0x5e, +0x02, +0x94, +0x02, +0x95, +0x02, +0xc5, +0x02, +0xf9 +}}, + {0xe2, 16, {0x03, +0x19, +0x03, +0x44, +0x03, +0x5f, +0x03, +0x81, +0x03, +0x95, +0x03, +0xAf, +0x03, +0xba, +0x03, +0xc5 +}}, + {0xe3, 4, {0x03,0xd0,0x03,0xd8}}, +// Negative Green Gamma + {0xe4, 16, {0x00, +0x00, +0x00, +0x60, +0x00, +0xbb, +0x00, +0xf8, +0x01, +0x1a, +0x01, +0x43, +0x01, +0x61, +0x01, +0x91 +}}, + {0xe5, 16, {0x01, +0xb5, +0x01, +0xee, +0x02, +0x1a, +0x02, +0x5e, +0x02, +0x94, +0x02, +0x95, +0x02, +0xc5, +0x02, +0xf9 +}}, + {0xe6, 16, {0x03, +0x19, +0x03, +0x44, +0x03, +0x5f, +0x03, +0x81, +0x03, +0x95, +0x03, +0xAf, +0x03, +0xba, +0x03, +0xc5 +}}, + {0xe7, 4, {0x03,0xd0,0x03,0xd8}}, +// Negative Blue Gamma + {0xe8, 16, {0x00, +0x00, +0x00, +0x60, +0x00, +0xbb, +0x00, +0xf8, +0x01, +0x1a, +0x01, +0x43, +0x01, +0x61, +0x01, +0x91 +}}, + {0xe9, 16, {0x01, +0xb5, +0x01, +0xee, +0x02, +0x1a, +0x02, +0x5e, +0x02, +0x94, +0x02, +0x95, +0x02, +0xc5, +0x02, +0xf9 +}}, + {0xea, 16, {0x03, +0x19, +0x03, +0x44, +0x03, +0x5f, +0x03, +0x81, +0x03, +0x95, +0x03, +0xAf, +0x03, +0xba, +0x03, +0xc5 +}}, + + {0xeb, 4, {0x03,0xd0,0x03,0xd8}}, +//power setting + {0xb0, 1, {0x0a}}, + {0xb6, 1, {0x34}}, + {0xb1, 1, {0x0a}}, + {0xb7, 1, {0x24}}, + {0xb2, 1, {0x00}}, + {0xb8, 1, {0x30}}, + {0xb3, 1, {0x0a}}, + + {0xb9, 1, {0x24}}, + {0xb4, 1, {0x0a}}, + {0xba, 1, {0x34}}, + + + + {0xbc, 3, {0x00,0x78,0x00}}, + {0xbd, 3, {0x00,0x78,0x00}}, + {0xbe, 1, {0x38}}, //4C +// set PFM for charge bump + {0xc2, 1, {0x00}}, + {0x3a, 1, {0x77}}, + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + +//************************************* + // Sleep Out +//************************************* + {0x11, 0, {}}, + {REGFLAG_DELAY, 200, {}}, +//************************************* +// Display On +//************************************* + {0x29, 0, {}}, + {REGFLAG_DELAY, 200, {}}, + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 0, {0x00}}, + {REGFLAG_DELAY, 125, {}}, + + // Display ON + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + + // Display off sequence + {0x28, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { +{0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + unsigned char lcd_id =0; + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + //lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + volatile unsigned int id = 0; + volatile unsigned char buffer[3]; + unsigned int array[16]; + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + volatile unsigned char lcd_id = 0; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(10); + //lcm_init(); + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700; + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + //read_reg_v2(0xF4, buffer, 2); + //id = buffer[0]; //we only need ID + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + lcd_id = mt_get_gpio_in(GPIO_LCD_ID); + //id1 = read_reg(0xc5); + //id2 = read_reg(0xc5); + //id3 = read_reg(0xc5); + read_reg_v2(0xc5, buffer, 3); +#if defined(BUILD_UBOOT) + printf("%s, zhaoshaopeng buffer[0] = 0x%08x, buffer[1] = 0x%08x, id= 0x%08x, lcd_id=%d\n", __func__, buffer[0], buffer[1], id, lcd_id); +#endif + if((buffer[0] ==0x55)&&(lcd_id==1)&&(buffer[1] ==0x16)) + return 1; + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35516_tm_lcm_drv = +{ + .name = "nt35516_tm", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/nt35516_truly/nt35516_truly.c b/bq_aquaris77/lcm/nt35516_truly/nt35516_truly.c new file mode 100755 index 0000000..a75850d --- /dev/null +++ b/bq_aquaris77/lcm/nt35516_truly/nt35516_truly.c @@ -0,0 +1,563 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include + +#include "lcm_drv.h" + +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xfd // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0x35, 1, {0x00}},//turn on te + {0xFF, 4, {0xAA, 0x55, 0x25,0x01}}, + {0xF2, 35, {0x00, 0x00, 0x4A,0x0A,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x51,0x00,0x01,0x00,0x01}}, + {0xF3, 7, {0x02, 0x03, 0x07,0x45,0x88,0xD4,0x0D}}, + {0xF0, 5, {0x55, 0xAA, 0x52,0x08,0x00}}, + {0xB1, 3, {0x7C, 0x00, 0x00}}, + {0xB8, 4, {0x01, 0x02, 0x02,0x02}}, + {0xBB, 3, {0x63, 0x03,0x63}}, + {0xBC, 3, {0x00, 0x00,0x00}}, + //{0xBD, 5, {0x01, 0x41, 0x10,0x38, 0x01}}, + {0xC9, 6, {0x63, 0x06, 0x0D,0x1A,0x17,0x00}}, + {0xF0, 5, {0x55, 0xAA, 0x52,0x08,0x01}}, + {0xB0, 3, {0x05, 0x05, 0x05}}, + {0xB1, 3, {0x05, 0x05, 0x05}}, + {0xB2, 3, {0x01, 0x01, 0x01}}, + {0xB3, 3, {0x0E, 0x0E, 0x0E}}, + {0xB4, 3, {0x0A, 0x0A, 0x0A}}, + {0xB6, 3, {0x44, 0x44, 0x44}}, + {0xB7, 3, {0x34, 0x34, 0x34}}, + {0xB8, 3, {0x20, 0x20, 0x20}}, + {0xB9, 3, {0x26, 0x26, 0x26}}, + {0xBA, 3, {0x24, 0x24, 0x24}}, + {0xBC, 3, {0x00, 0xC8, 0x00}}, + {0xBD, 3, {0x00, 0xC8, 0x00}}, + + {0xBE, 1, {0x80}}, //96 + {0xC0, 2, {0x00,0x08}}, + {0xCA, 1, {0x00}}, + {0xD0, 4, {0x0A,0x10,0x0D,0x0F}}, + + {0xD1, 16, {0x00,0x70,0x01,0x16,0x01,0x2A,0x01,0x48,0x01,0x61,0x01,0x7D,0x01,0x94,0x01,0xb7}}, + {0xD2, 16, {0x01,0xd1,0x01,0xfe,0x02,0x1f,0x02,0x55,0x02,0x80,0x02,0x81,0x02,0xad,0x02,0xdf}}, + {0xD3, 16, {0x02,0xf7,0x03,0x1f,0x03,0x3a,0x03,0x59,0x03,0x70,0x03,0x8b,0x03,0x99,0x03,0xae}}, + {0xD4, 4, {0x03,0xFe,0x03,0xFF}}, + + {0xD5, 16, {0x00,0x70,0x01,0x16,0x01,0x2A,0x01,0x48,0x01,0x61,0x01,0x7D,0x01,0x94,0x01,0xb7}}, + {0xD6, 16, {0x01,0xd1,0x01,0xfe,0x02,0x1f,0x02,0x55,0x02,0x80,0x02,0x81,0x02,0xad,0x02,0xdf}}, + {0xD7, 16, {0x02,0xf7,0x03,0x1f,0x03,0x3a,0x03,0x59,0x03,0x70,0x03,0x8b,0x03,0x99,0x03,0xae}}, + {0xD8, 4, {0x03,0xFd,0x03,0xFF}}, + + {0xD9, 16, {0x00,0x70,0x01,0x16,0x01,0x2A,0x01,0x48,0x01,0x61,0x01,0x7D,0x01,0x94,0x01,0xb7}}, + {0xDd, 16, {0x01,0xd1,0x01,0xfe,0x02,0x1f,0x02,0x55,0x02,0x80,0x02,0x81,0x02,0xad,0x02,0xdf}}, + {0xDe, 16, {0x02,0xf7,0x03,0x1f,0x03,0x3a,0x03,0x59,0x03,0x70,0x03,0x8b,0x03,0x99,0x03,0xae}}, + {0xDf, 4, {0x03,0xFd,0x03,0xFF}}, + + + {0xe0, 16, {0x00,0x70,0x01,0x16,0x01,0x2A,0x01,0x48,0x01,0x61,0x01,0x7D,0x01,0x94,0x01,0xb7}}, + {0xe1, 16, {0x01,0xd1,0x01,0xfe,0x02,0x1f,0x02,0x55,0x02,0x80,0x02,0x81,0x02,0xad,0x02,0xdf}}, + {0xe2, 16, {0x02,0xf7,0x03,0x1f,0x03,0x3a,0x03,0x59,0x03,0x70,0x03,0x8b,0x03,0x99,0x03,0xae}}, + {0xe3, 4, {0x03,0xFd,0x03,0xFF}}, + + + {0xe4, 16, {0x00,0x70,0x01,0x16,0x01,0x2A,0x01,0x48,0x01,0x61,0x01,0x7D,0x01,0x94,0x01,0xb7}}, + {0xe5, 16, {0x01,0xd1,0x01,0xfe,0x02,0x1f,0x02,0x55,0x02,0x80,0x02,0x81,0x02,0xad,0x02,0xdf}}, + {0xe6, 16, {0x02,0xf7,0x03,0x1f,0x03,0x3a,0x03,0x59,0x03,0x70,0x03,0x8b,0x03,0x99,0x03,0xae}}, + {0xe7, 4, {0x03,0xFd,0x03,0xFF}}, + + {0xe8, 16, {0x00,0x70,0x01,0x16,0x01,0x2A,0x01,0x48,0x01,0x61,0x01,0x7D,0x01,0x94,0x01,0xb7}}, + {0xe9, 16, {0x01,0xd1,0x01,0xfe,0x02,0x1f,0x02,0x55,0x02,0x80,0x02,0x81,0x02,0xad,0x02,0xdf}}, + {0xea, 16, {0x02,0xf7,0x03,0x1f,0x03,0x3a,0x03,0x59,0x03,0x70,0x03,0x8b,0x03,0x99,0x03,0xae}}, + {0xeb, 4, {0x03,0xFd,0x03,0xFF}}, + + + {0x11, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + {0x3A, 1, {0x77}}, + + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {0x2c, 1, {0x00}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 0, {0x00}}, + {REGFLAG_DELAY, 125, {}}, + + // Display ON + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + + // Display off sequence + {0x28, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { +{0xf0, 5, {0x55, 0xaa, 0x52, 0x08, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + unsigned char lcd_id =0; + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + //lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + volatile unsigned int id = 0; + volatile unsigned char buffer[3]; + unsigned int array[16]; + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + volatile unsigned char lcd_id = 0; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(10); + //lcm_init(); + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700; + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + //read_reg_v2(0xF4, buffer, 2); + //id = buffer[0]; //we only need ID + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + lcd_id = mt_get_gpio_in(GPIO_LCD_ID); + //id1 = read_reg(0xc5); + //id2 = read_reg(0xc5); + //id3 = read_reg(0xc5); + read_reg_v2(0xc5, buffer, 3); +#if defined(BUILD_UBOOT) + printf("%s, zhaoshaopeng buffer[0] = 0x%08x, buffer[1] = 0x%08x, id= 0x%08x, lcd_id=%d\n", __func__, buffer[0], buffer[1], id, lcd_id); +#endif + if((buffer[0] ==0x55)&&(lcd_id==0)&&(buffer[1] ==0x16)) + return 1; + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35516_truly_lcm_drv = +{ + .name = "nt35516_truly", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/nt35565_3D/nt35565_3d.c b/bq_aquaris77/lcm/nt35565_3D/nt35565_3d.c new file mode 100644 index 0000000..52f33a3 --- /dev/null +++ b/bq_aquaris77/lcm/nt35565_3D/nt35565_3d.c @@ -0,0 +1,349 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x55, 1, {0x02}}, + {REGFLAG_DELAY, 1, {}}, + + {0x53, 1, {0x2C}}, + {REGFLAG_DELAY, 1, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {REGFLAG_DELAY, 1, {}}, + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x51, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +//static struct LCM_setting_table lcm_set_window[] = { +// {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, +// {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, +// {REGFLAG_END_OF_TABLE, 0x00, {}} +//}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + // LCM driver IC specifies 15ms needed after sleep out. But we need more delay time to make sure latest RAM data has been refreshed to screen. + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +//static struct LCM_setting_table lcm_backlight_level_setting[] = { +// {0x51, 1, {0xFF}}, +// {REGFLAG_END_OF_TABLE, 0x00, {}} +//}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + // NT35565 accept maximum 510Mbps + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + // Work around for Novatek driver IC. If it entered ULP mode, it must be reset before resume. + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +//static void lcm_setbacklight(unsigned int level) +//{ + // Refresh value of backlight level. +// lcm_backlight_level_setting[0].para_list[0] = level; + +// push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +//} + + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +*/ +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/bq_aquaris77/lcm/nt35582_mcu/nt35582_mcu.c b/bq_aquaris77/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..7efa37e --- /dev/null +++ b/bq_aquaris77/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,429 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; //note:this para is different between 6573 and 6575 + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.read_latency = 0; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/bq_aquaris77/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c b/bq_aquaris77/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c new file mode 100644 index 0000000..c663789 --- /dev/null +++ b/bq_aquaris77/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c @@ -0,0 +1,380 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->io_select_mode = 1; //note:this para is different between 6573 and 6575 + + + params->dbi.port = 0; //DBI port must be 0 or 1 on mt6575, should not be 2 + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 4; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_6575_lcm_drv = +{ + .name = "nt35582_mcu_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/bq_aquaris77/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c b/bq_aquaris77/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c new file mode 100644 index 0000000..6fa917d --- /dev/null +++ b/bq_aquaris77/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c @@ -0,0 +1,393 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#if 0 +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +/* +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) +*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} + +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +}*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_div1 = 0x15; + params->dpi.mipi_pll_clk_div2 = 5; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB565; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + + params->dbi.serial.css = 2; + params->dbi.serial.csh = 2; + params->dbi.serial.rd_1st = 2; + params->dbi.serial.rd_2nd = 2; + params->dbi.serial.wr_1st = 2; + params->dbi.serial.wr_2nd = 2; + params->dbi.serial.sif_3wire = 0; + params->dbi.serial.sif_sdi = 0; + + params->dbi.serial.sif_1st_pol = 0; + params->dbi.serial.sif_sck_def = 0; + params->dbi.serial.sif_div2 = 0; + params->dbi.serial.sif_hw_cs = 1; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + params->dpi.i2x_en = 0; + params->dpi.i2x_edge = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +// config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +// config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ +// config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER nt35582_rgb_6575_lcm_drv = +{ + .name = "nt35582_rgb_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/bq_aquaris77/lcm/otm8009a_yashi/otm8009a_yashi.c b/bq_aquaris77/lcm/otm8009a_yashi/otm8009a_yashi.c new file mode 100755 index 0000000..6c1ce6c --- /dev/null +++ b/bq_aquaris77/lcm/otm8009a_yashi/otm8009a_yashi.c @@ -0,0 +1,2159 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID_OMT (0x40) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFD // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq_Vzsp(cmd, ppara,count) dsi_set_cmdq_V2(cmd, count, ppara, 1) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update); + +static struct LCM_setting_table blockwrite_otm8009a_setting[] = { + //DCS Write + {0xB7, 2, {0x10, 0x02}}, + //Set VC2=0 + {0xB8, 2, {0x04, 0x00}}, + {0xbc, 2, {0x05, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x05, 0x00}}, + {0xbf, 2, {0x05, 0x00}}, + + + {REGFLAG_DELAY, 200, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +unsigned char p_data[20] = {0}; + +/* +void BlockWrite_OTM8009A_MIPI(U32 XS,U32 YS,U32 XE,U32 YE) +{ + + XS=0; + YS=0; + XE=480; + YE=800; + + + p_data[0] = 0x2A; p_data[1]=(XS>>8); p_data[2]=XS;p_data[3]=XE>>8;p_data[4]=XE; + dsi_set_cmdq_Vzsp(0xbf, p_data, 5); + + p_data[0] = 0x10; p_data[1]=0x02; + dsi_set_cmdq_Vzsp(0xB7, p_data, 2); + p_data[0] = 0x04; p_data[1]=0x00; + dsi_set_cmdq_Vzsp(0xB8, p_data, 2); + p_data[0] = 0x05; p_data[1]=0x00; + dsi_set_cmdq_Vzsp(0xbc, p_data, 2); + p_data[0] = 0x00; p_data[1]=0x00; + dsi_set_cmdq_Vzsp(0xBD, p_data, 2); + p_data[0] = 0x05; p_data[1]=0x00; + dsi_set_cmdq_Vzsp(0xbe, p_data, 2); + + p_data[0] = 0x2b; p_data[1]=YS>>8; p_data[2]=YS;p_data[3]=YE>>8;p_data[4]=YE; + dsi_set_cmdq_Vzsp(0xbf, p_data, 5); + + p_data[0] = 0x50; p_data[1]=0x02; + dsi_set_cmdq_Vzsp(0xB7, p_data, 2); + + p_data[0] = 0x00; p_data[1]=0x94; + dsi_set_cmdq_Vzsp(0xbc, p_data, 2); + + p_data[0] = 0x11; p_data[1]=0x00; + dsi_set_cmdq_Vzsp(0xBD, p_data, 2); + p_data[0] = 0xc0; p_data[1]=0x03; + dsi_set_cmdq_Vzsp(0xbe, p_data, 2); + + + wrtie_cmd(0x2C); + MDELAY(50); + + } + +*/ +static struct LCM_setting_table Init_SSD2805_Initinal_setting[] = { + {REGFLAG_DELAY, 50, {}}, + {0xB9, 2, {0x00, 0x00}}, + {0xBa, 2, {0x31, 0x00}}, + + {0xbb, 2, {0x66, 0x00}}, + {0xb9, 2, {0x10, 0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table Init_SSD2805_Write_0P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x01, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x01, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_0P(void) +{ + push_table(Init_SSD2805_Write_0P_setting, sizeof(Init_SSD2805_Write_0P_setting) / sizeof(struct LCM_setting_table), 1); + +} +static struct LCM_setting_table Init_SSD2805_Write_1P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x02, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x02, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_1P(void) +{ + push_table(Init_SSD2805_Write_1P_setting, sizeof(Init_SSD2805_Write_1P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_2P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x03, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x03, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_2P(void) +{ + push_table(Init_SSD2805_Write_2P_setting, sizeof(Init_SSD2805_Write_2P_setting) / sizeof(struct LCM_setting_table), 1); + +} +static struct LCM_setting_table Init_SSD2805_Write_3P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x04, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x04, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_3P(void) +{ + push_table(Init_SSD2805_Write_3P_setting, sizeof(Init_SSD2805_Write_3P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_4P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x05, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x05, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_4P(void) +{ + push_table(Init_SSD2805_Write_4P_setting, sizeof(Init_SSD2805_Write_4P_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static struct LCM_setting_table Init_SSD2805_Write_5P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x06, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x06, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_5P(void) +{ + push_table(Init_SSD2805_Write_5P_setting, sizeof(Init_SSD2805_Write_5P_setting) / sizeof(struct LCM_setting_table), 1); + +} +static struct LCM_setting_table Init_SSD2805_Write_6P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x07, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x07, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_6P(void) +{ + push_table(Init_SSD2805_Write_6P_setting, sizeof(Init_SSD2805_Write_6P_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static struct LCM_setting_table Init_SSD2805_Write_7P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x08, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x08, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_7P(void) +{ + push_table(Init_SSD2805_Write_7P_setting, sizeof(Init_SSD2805_Write_7P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_8P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x09, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x09, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_8P(void) +{ + push_table(Init_SSD2805_Write_8P_setting, sizeof(Init_SSD2805_Write_8P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_9P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x0a, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x0a, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_9P(void) +{ + push_table(Init_SSD2805_Write_9P_setting, sizeof(Init_SSD2805_Write_9P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_10P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x0b, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x0b, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_10P(void) +{ + push_table(Init_SSD2805_Write_10P_setting, sizeof(Init_SSD2805_Write_10P_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static struct LCM_setting_table Init_SSD2805_Write_12P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x0d, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x0d, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_12P(void) +{ + push_table(Init_SSD2805_Write_12P_setting, sizeof(Init_SSD2805_Write_12P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_14P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x0f, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x0f, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_14P(void) +{ + push_table(Init_SSD2805_Write_14P_setting, sizeof(Init_SSD2805_Write_14P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_15P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x10, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x10, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_15P(void) +{ + push_table(Init_SSD2805_Write_15P_setting, sizeof(Init_SSD2805_Write_15P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_16P_setting[] = { + {0xB7, 2, {0x10, 0x02}}, + {0xB8, 2, {0x04, 0x00}}, + + {0xbc, 2, {0x11, 0x00}}, + {0xbd, 2, {0x00, 0x00}}, + {0xbe, 2, {0x11, 0x00}}, + //{0xbf, 0, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_16P(void) +{ + push_table(Init_SSD2805_Write_16P_setting, sizeof(Init_SSD2805_Write_16P_setting) / sizeof(struct LCM_setting_table), 1); + +} + +static struct LCM_setting_table Init_SSD2805_Write_360P_1_setting[] = { +{0xD4, 360, { +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40, +0x00, +0x40 + } + + }, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table Init_SSD2805_Write_360P_2_setting[] = { +{0xD5, 360, { +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, +0x00, +0x60, + + } + + }, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static void Init_SSD2805_Write_360P_1(void) +{ + push_table(Init_SSD2805_Write_360P_1_setting, sizeof(Init_SSD2805_Write_360P_1_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void Init_SSD2805_Write_360P_2(void) +{ + push_table(Init_SSD2805_Write_360P_2_setting, sizeof(Init_SSD2805_Write_360P_2_setting) / sizeof(struct LCM_setting_table), 1); + +} + +void init_to_read_otm8009(void) +{ + p_data[0]=0x80; p_data[1]=0x09;p_data[2]=0x01; + //Init_SSD2805_Write_3P(); + dsi_set_cmdq_Vzsp(0xff, p_data, 3); + +//{0xbf, 0, {0x00}}, + //Init_SSD2805_Write_1P(); // enable Orise mode + p_data[0]=0x80; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + + //Init_SSD2805_Write_2P(); + p_data[0]=0x80; p_data[1]=0x09; + dsi_set_cmdq_Vzsp(0xff, p_data, 2); + MDELAY(200); +} + +void Init_OTM8009A_BOE500_MIPI_MPU8bits(void) +{ + p_data[0]=0x80; p_data[1]=0x09;p_data[2]=0x01; + //Init_SSD2805_Write_3P(); + dsi_set_cmdq_Vzsp(0xff, p_data, 3); + +//{0xbf, 0, {0x00}}, + //Init_SSD2805_Write_1P(); // enable Orise mode + p_data[0]=0x80; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + + //Init_SSD2805_Write_2P(); + p_data[0]=0x80; p_data[1]=0x09; + dsi_set_cmdq_Vzsp(0xff, p_data, 2); + +//************************************************************************** + //Init_SSD2805_Write_1P(); + p_data[0]=0x82; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x20; + dsi_set_cmdq_Vzsp(0xb2, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x80; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x03; + dsi_set_cmdq_Vzsp(0xC5, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x84; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x08; + dsi_set_cmdq_Vzsp(0xc0, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0xB4; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x00; + dsi_set_cmdq_Vzsp(0xC0, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0xA1; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x08; + dsi_set_cmdq_Vzsp(0xC1, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x90; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + + //Init_SSD2805_Write_5P(); + p_data[0]=0x96;p_data[1] = 0x0F; p_data[2]=0x01;p_data[3] = 0x00; p_data[4]=0x33; + dsi_set_cmdq_Vzsp(0xc5, p_data, 5); + + //Init_SSD2805_Write_1P(); + p_data[0]=0xA3; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x1b; + dsi_set_cmdq_Vzsp(0xC0, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x81; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x83; + dsi_set_cmdq_Vzsp(0xC4, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0xB1; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x29; + dsi_set_cmdq_Vzsp(0xC5, p_data, 1); + + //Init_SSD2805_Write_2P(); + p_data[0]=0x70; p_data[0]=0x70; + dsi_set_cmdq_Vzsp(0xD8, p_data, 2); + + //Init_SSD2805_Write_1P(); + p_data[0]=0x36; + dsi_set_cmdq_Vzsp(0xD9, p_data, 1); + +//*********************************CE*********************************** + Init_SSD2805_Write_360P_1(); + +//D5 setting + Init_SSD2805_Write_360P_2(); + + +/* + Init_SSD2805_Write_1P(); + WriteR(0x00); + WriteR(0x80); + Init_SSD2805_Write_1P(); + WriteR(0xD6); + WriteR(0x08); +*/ + + //p_data[0]=0x80; +// dsi_set_cmdq_Vzsp(0x00, p_data, 1); +// p_data[0]=0x08; +// dsi_set_cmdq_Vzsp(0xd6, p_data, 1); +//*********************************Gamma*********************************** +// Positive + + //Init_SSD2805_Write_16P(); + p_data[0]=0x05;p_data[1] = 0x16; p_data[2]=0x17; + p_data[3] = 0x12; p_data[4]=0x0B;p_data[5] = 0x1D; p_data[6]=0x0F; + p_data[7] = 0x0E; p_data[8]=0x00;p_data[9] = 0x05; p_data[10]=0x02; + p_data[11] = 0x06; p_data[12]=0x0E;p_data[13] = 0x20; p_data[14]=0x1D;p_data[15]=0x16; + dsi_set_cmdq_Vzsp(0xE1, p_data, 16); + +//NEGATIVE + + //Init_SSD2805_Write_16P(); + p_data[0]=0x05;p_data[1] = 0x16; p_data[2]=0x17; + p_data[3] = 0x12; p_data[4]=0x0B;p_data[5] = 0x1D; p_data[6]=0x0F; + p_data[7] = 0x0E; p_data[8]=0x00;p_data[9] = 0x05; p_data[10]=0x02; + p_data[11] = 0x07; p_data[12]=0x0E;p_data[13] = 0x20; p_data[14]=0x1D;p_data[15]=0x16; + dsi_set_cmdq_Vzsp(0xE2, p_data, 16); + +///////////////////////////////////////////////////////////////////// + /* Init_SSD2805_Write_1P(); + WriteR(0x00); + WriteR(0xa6); + Init_SSD2805_Write_1P(); + WriteR(0xb3); // reg_panel_zinv, reg_panel_zinv_pixel, reg_panel_zinv_odd, reg_panel_zigzag, reg_panel_zigzag_blue, reg_panel_zigzag_shift_r, reg_panel_zigzag_odd + WriteR(0x20); + + + Init_SSD2805_Write_1P(); + WriteR(0x00); + WriteR(0xa7); + Init_SSD2805_Write_1P(); + WriteR(0xb3); // panel_set[0] = 1 + WriteR(0x01); +*/ + + //Init_SSD2805_Write_1P(); + p_data[0]=0x80; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_6P(); + p_data[0]=0x85;p_data[1] = 0x01; p_data[2]=0x00;p_data[3] = 0x84; p_data[4]=0x01;p_data[5]=0x00; + dsi_set_cmdq_Vzsp(0xce, p_data, 6); + + //Init_SSD2805_Write_1P(); + p_data[0]=0xa0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_14P(); + p_data[0]=0x18;p_data[1] = 0x04; p_data[2]=0x03; + p_data[3] = 0x21; p_data[4]=0x00;p_data[5] = 0x00; p_data[6]=0x00; + p_data[7] = 0x18; p_data[8]=0x03;p_data[9] = 0x03; p_data[10]=0x22; + p_data[11] = 0x00; p_data[12]=0x00;p_data[13] = 0x00; + dsi_set_cmdq_Vzsp(0xce, p_data, 14); + + //Init_SSD2805_Write_1P(); + p_data[0]=0xb0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_14P(); + p_data[0]=0x18;p_data[1] = 0x02; p_data[2]=0x03; + p_data[3] = 0x23; p_data[4]=0x00;p_data[5] = 0x00; p_data[6]=0x00; + p_data[7] = 0x18; p_data[8]=0x01;p_data[9] = 0x03; p_data[10]=0x24; + p_data[11] = 0x00; p_data[12]=0x00;p_data[13] = 0x00; + dsi_set_cmdq_Vzsp(0xce, p_data, 14); + + + //Init_SSD2805_Write_1P(); + p_data[0]=0xc0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_10P(); + p_data[0]=0x01;p_data[1] = 0x01; p_data[2]=0x20; + p_data[3] = 0x20; p_data[4]=0x00;p_data[5] = 0x00; p_data[6]=0x01; + p_data[7] = 0x00; p_data[8]=0x00;p_data[9] = 0x00; + dsi_set_cmdq_Vzsp(0xcf, p_data, 10); + + //Init_SSD2805_Write_1P(); + p_data[0]=0xd0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0] = 0x00; + dsi_set_cmdq_Vzsp(0xcf, p_data, 1); + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- +/* +// CB8x + + Init_SSD2805_Write_1P(); + WriteR(0x00); + WriteR(0x80); + Init_SSD2805_Write_10P(); + WriteR(0xcb);//cb81[7:0] : signal mode setting of sig4, sig3, sig2, sig1 ( sleep in ) + WriteR(0x00); + //cb82[7:0] : signal mode setting of sig8, sig7, sig6, sig5 ( sleep in ) + WriteR(0x00); + //cb83[7:0] : signal mode setting of sig12, sig11, sig10, sig9 ( sleep in ) + WriteR(0x00); + //cb84[7:0] : signal mode setting of sig16, sig15, sig14, sig13 ( sleep in ) + WriteR(0x00); + //cb85[7:0] : signal mode setting of sig20, sig19, sig18, sig17 ( sleep in ) + WriteR(0x00); + //cb86[7:0] : signal mode setting of sig24, sig23, sig22, sig21 ( sleep in ) + WriteR(0x00); + //cb87[7:0] : signal mode setting of sig28, sig27, sig26, sig25 ( sleep in ) + WriteR(0x00); + //cb88[7:0] : signal mode setting of sig32, sig31, sig30, sig29 ( sleep in ) + WriteR(0x00); + //cb89[7:0] : signal mode setting of sig36, sig35, sig34, sig33 ( sleep in ) + WriteR(0x00); + //cb8a[7:0] : signal mode setting of sig40, sig39, sig38, sig37 ( sleep in ) + WriteR(0x00); + +// cb9x + Init_SSD2805_Write_1P(); + WriteR(0x00); + WriteR(0x90); + Init_SSD2805_Write_15P(); + WriteR(0xcb);//cb91[7:0] : enmode L-byte of sig1 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb92[7:0] : enmode L-byte of sig2 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb93[7:0] : enmode L-byte of sig3 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb94[7:0] : enmode L-byte of sig4 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb95[7:0] : enmode L-byte of sig5 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb96[7:0] : enmode L-byte of sig6 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb97[7:0] : enmode L-byte of sig7 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb98[7:0] : enmode L-byte of sig8 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb99[7:0] : enmode L-byte of sig9 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb9a[7:0] : enmode L-byte of sig10 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb9b[7:0] : enmode L-byte of sig11 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb9c[7:0] : enmode L-byte of sig12 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb9d[7:0] : enmode L-byte of sig13 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb9e[7:0] : enmode L-byte of sig14 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cb9f[7:0] : enmode L-byte of sig15 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + +// cbax + Init_SSD2805_Write_1P(); + WriteR(0x00); + WriteR(0xa0); + Init_SSD2805_Write_15P(); + WriteR(0xcb);//cba1[7:0] : enmode L-byte of sig16 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cba2[7:0] : enmode L-byte of sig17 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cba3[7:0] : enmode L-byte of sig18 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cba4[7:0] : enmode L-byte of sig19 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cba5[7:0] : enmode L-byte of sig20 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cba6[7:0] : enmode L-byte of sig21 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cba7[7:0] : enmode L-byte of sig22 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cba8[7:0] : enmode L-byte of sig23 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cba9[7:0] : enmode L-byte of sig24 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbaa[7:0] : enmode L-byte of sig25 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbab[7:0] : enmode L-byte of sig26 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbac[7:0] : enmode L-byte of sig27 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbad[7:0] : enmode L-byte of sig28 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbae[7:0] : enmode L-byte of sig29 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbaf[7:0] : enmode L-byte of sig30 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + +// cbbx + Init_SSD2805_Write_1P(); + WriteR(0x00); + WriteR(0xb0); + Init_SSD2805_Write_10P(); + WriteR(0xcb);//cbb1[7:0] : enmode L-byte of sig31 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbb2[7:0] : enmode L-byte of sig32 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbb3[7:0] : enmode L-byte of sig33 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbb4[7:0] : enmode L-byte of sig34 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbb5[7:0] : enmode L-byte of sig35 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbb6[7:0] : enmode L-byte of sig36 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbb7[7:0] : enmode L-byte of sig37 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbb8[7:0] : enmode L-byte of sig38 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbb9[7:0] : enmode L-byte of sig39 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + //cbba[7:0] : enmode L-byte of sig40 (pwron_3, pwron_2, pwron_1, pwron_0 ) + WriteR(0x00); + */ +// cbcx + //Init_SSD2805_Write_1P(); + p_data[0]=0xc0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_15P(); + p_data[0]=0x00;p_data[1] = 0x04; p_data[2]=0x04; + p_data[3] = 0x04; p_data[4]=0x04;p_data[5] = 0x04; p_data[6]=0x00; + p_data[7] = 0x00; p_data[8]=0x00;p_data[9] = 0x00; p_data[10]=0x00; + p_data[11] = 0x00; p_data[12]=0x00;p_data[13] = 0x00; p_data[14] = 0x00; + dsi_set_cmdq_Vzsp(0xcb, p_data,15); + +// cbdx + //Init_SSD2805_Write_1P(); + p_data[0] = 0xd0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + //Init_SSD2805_Write_15P(); + p_data[0]=0x00;p_data[1] = 0x00; p_data[2]=0x00; + p_data[3] = 0x00; p_data[4]=0x00;p_data[5] = 0x00; p_data[6]=0x04; + p_data[7] = 0x04; p_data[8]=0x04;p_data[9] = 0x04; p_data[10]=0x04; + p_data[11] = 0x00; p_data[12]=0x00;p_data[13] = 0x00; p_data[14] = 0x00; + dsi_set_cmdq_Vzsp(0xcb, p_data,15); +// cbex + //Init_SSD2805_Write_1P(); + p_data[0] = 0xe0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_10P(); + p_data[0]=0x00; p_data[1]=0x00;p_data[2] = 0x00; p_data[3]=0x00; + p_data[4] = 0x00; p_data[5]=0x00;p_data[6] = 0x00; p_data[7]=0x00; + p_data[8] = 0x00; p_data[9]=0x00; + dsi_set_cmdq_Vzsp(0xcb, p_data,10); +// cbfx + //Init_SSD2805_Write_1P(); + p_data[0] =0xf0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_10P(); + p_data[0] = 0xff; p_data[1]=0xFF;p_data[2] = 0xFF; p_data[3]=0xFF; + p_data[4] = 0xFF; p_data[5]=0xFF;p_data[6] = 0xFF; p_data[7]=0xFF; + p_data[8] = 0xFF; p_data[9]=0xFF; + dsi_set_cmdq_Vzsp(0xf0, p_data,10); +// cc8x + //Init_SSD2805_Write_1P(); + p_data[0] = 0x80; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + //Init_SSD2805_Write_10P(); + p_data[0]=0x00;p_data[1] = 0x26; p_data[2]=0x09; + p_data[3] = 0x0B; p_data[4]=0x01;p_data[5] = 0x25; p_data[6]=0x00; + p_data[7] = 0x00; p_data[8]=0x00;p_data[9] = 0x00; + dsi_set_cmdq_Vzsp(0xcc, p_data, 10); +// cc9x + //Init_SSD2805_Write_1P(); + p_data[0] = 0x90; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_15P(); + p_data[0] = 0x00; p_data[1]=0x00;p_data[2] = 0x00; p_data[3]=0x00; + p_data[4] = 0x00; p_data[5]=0x00;p_data[6] = 0x00; p_data[7]=0x00; + p_data[8] = 0x00; p_data[9]=0x00;p_data[10] = 0x00; + p_data[11] = 0x26; p_data[12]=0x0A;p_data[13] = 0x0C; p_data[14] = 0x02; + dsi_set_cmdq_Vzsp(0xcc, p_data,15); +// ccax + //Init_SSD2805_Write_1P(); + p_data[0] = 0xa0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_15P(); + p_data[0] = 0x25; p_data[1]=0x00;p_data[2] = 0x00; p_data[3]=0x00; + p_data[4] = 0x00; p_data[5]=0x00;p_data[6] = 0x00; p_data[7]=0x00; + p_data[8] = 0x00; p_data[9]=0x00;p_data[10] = 0x00; p_data[11]=0x00; + p_data[12] = 0x00; p_data[13]=0x00;p_data[14] = 0x00; + dsi_set_cmdq_Vzsp(0xcc, p_data,15); +// ccbx + //Init_SSD2805_Write_1P(); + p_data[0] = 0xb0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + //Init_SSD2805_Write_10P(); + p_data[0]=0x00;p_data[1] = 0x25; p_data[2]=0x0C; + p_data[3] = 0x0A; p_data[4]=0x02;p_data[5] = 0x26; p_data[6]=0x00; + p_data[7] = 0x00; p_data[8]=0x00;p_data[9] = 0x00; + dsi_set_cmdq_Vzsp(0xcc, p_data,10); +// cccx + //Init_SSD2805_Write_1P(); + p_data[0] = 0xc0; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_15P(); + p_data[0] = 0x00; p_data[1]=0x00;p_data[2] = 0x00; p_data[3]=0x00; + p_data[4] = 0x00; p_data[5]=0x00;p_data[6] = 0x00; p_data[7]=0x00; + p_data[8] = 0x00; p_data[9]=0x00;p_data[10] = 0x00; + p_data[11] = 0x25; p_data[12]=0x0B;p_data[13] = 0x09; p_data[14] = 0x01; + dsi_set_cmdq_Vzsp(0xcc, p_data,15); +// ccdx + //Init_SSD2805_Write_1P(); + p_data[0] =0xd0; + dsi_set_cmdq_Vzsp(0x00, p_data,1); + + //Init_SSD2805_Write_15P(); + p_data[0] = 0x26; p_data[1]=0x00;p_data[2] = 0x00; p_data[3]=0x00; + p_data[4] = 0x00; p_data[5]=0x00;p_data[6] = 0x00; p_data[7]=0x00; + p_data[8] = 0x00; p_data[9]=0x00;p_data[10] = 0x00; p_data[11]=0x00; + p_data[12] = 0x00; p_data[13]=0x00;p_data[14] = 0x00; + dsi_set_cmdq_Vzsp(0xcc, p_data,15); + + MDELAY(50); + + + + //Init_SSD2805_Write_1P(); + p_data[0] = 0xC7; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0] = 0x02; + dsi_set_cmdq_Vzsp(0xcf, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0] =0x81; + dsi_set_cmdq_Vzsp(0x00, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0] = 0x66;//0x77; //zhaoshaopeng for te + dsi_set_cmdq_Vzsp(0xC1, p_data, 1); + + //Init_SSD2805_Write_1P(); + p_data[0] = 0x77; + dsi_set_cmdq_Vzsp(0x3A, p_data, 1); + + p_data[0] = 0xd0;//zhaoshaopeng from 0xc0 + dsi_set_cmdq_Vzsp(0x36, p_data, 1);//flip and mirror + + + // ENABLE FMARK + //p_data[0] = 0x03;p_data[1] = 0x20;//800 + //p_data[0] = 0x01;p_data[1] = 0x90; + p_data[0] = 0x01;p_data[1] = 0xff; + dsi_set_cmdq_Vzsp(0x44, p_data, 2); + p_data[0]=0x00; + dsi_set_cmdq_Vzsp(0x35, p_data, 1); + + // p_data[0]=0x00; + //dsi_set_cmdq_Vzsp(0x34, p_data, 0); + //Init_SSD2805_Write_4P(); + p_data[0]=0x00;p_data[1] = 0x00; p_data[2]=0x01; + p_data[3] = 0xDF; + dsi_set_cmdq_Vzsp(0x2A, p_data,4); + + + //Init_SSD2805_Write_4P(); + p_data[0]=0x00;p_data[1] = 0x00; p_data[2]=0x03; + p_data[3] = 0x1F; + dsi_set_cmdq_Vzsp(0x2B, p_data,4); + + //Init_SSD2805_Write_0P(); + p_data[0] = 0x00; + dsi_set_cmdq_Vzsp(0x11, p_data, 0); + MDELAY(150); + + + + //Init_SSD2805_Write_0P(); + p_data[0] = 0x00; + dsi_set_cmdq_Vzsp(0x29, p_data, 0); + + MDELAY(50); + + + p_data[0] = 0x00; + dsi_set_cmdq_Vzsp(0x2c, p_data, 0); + + MDELAY(50); + //kfree(p_data); + + } + + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + +{0x00, 1 ,{0x00}},{0xff, 3 ,{0x80,0x09,0x01}}, +{0x00, 1 ,{0x80}},{0xff, 2 ,{0x80,0x09}}, +{0x00, 1 ,{0x03}},{0xff, 1 ,{0x01}}, +{0x00, 1 ,{0x00}},{0x21, 1 ,{0x00}}, +{0x00, 1 ,{0x00}},{0xd8, 2 ,{0x6f,0x6f}}, +{0x00, 1 ,{0x82}},{0xc5, 1 ,{0xa3}}, +{0x00, 1 ,{0x81}},{0xc1, 1 ,{0x66}}, +{0x00, 1 ,{0xa1}},{0xc1, 1 ,{0x08}}, +{0x00, 1 ,{0xb4}},{0xc0, 1 ,{0x50}}, +{0x00, 1 ,{0xa3}},{0xc0, 1 ,{0x00}}, +{0x00, 1 ,{0x89}},{0xc4, 1 ,{0x08}}, +{0x00, 1 ,{0x81}},{0xc4, 1 ,{0x83}}, +{0x00, 1 ,{0x90}},{0xc5, 3 ,{0x96,0xa7,0x01}}, +{0x00, 1 ,{0xb1}},{0xc5, 1 ,{0xa9}}, +{0x00, 1 ,{0x00}},{0xd9, 1 ,{0x15}}, +{0x00, 1 ,{0x00}},{0xe1, 16 ,{0x02,0x08,0x0E,0x10,0x09,0x1D,0x0E,0x0E,0x00,0x05,0x02,0x07,0x0E,0x24,0x23,0x1D}}, +{0x00, 1 ,{0x00}},{0xe2, 16 ,{0x02,0x08,0x0E,0x0F,0x09,0x1D,0x0E,0x0D,0x00,0x04,0x02,0x07,0x0E,0x25,0x23,0x1D}}, +{0x00, 1 ,{0x00}},{0x00, 1 ,{0x00}}, +{0x00, 1 ,{0xa1}},{0xb3, 1 ,{0x10}}, +{0x00, 1 ,{0xa7}},{0xb3, 1 ,{0x10}}, +{0x00, 1 ,{0x90}},{0xc0, 6 ,{0x00,0x44,0x00,0x00,0x00,0x03}}, +{0x00, 1 ,{0xa6}},{0xc1, 3 ,{0x00,0x00,0x00}}, +{0x00, 1 ,{0x80}},{0xce, 6 ,{0x87,0x03,0x00,0x86,0x03,0x00}}, +{0x00, 1 ,{0x90}},{0xce, 6 ,{0x33,0x1e,0x00,0x33,0x1f,0x00}}, +{0x00, 1 ,{0xa0}},{0xce, 14 ,{0x38,0x03,0x03,0x20,0x00,0x00,0x00,0x38,0x02,0x03,0x21,0x00,0x00,0x00}}, +{0x00, 1 ,{0xb0}},{0xce, 14 ,{0x38,0x01,0x03,0x22,0x00,0x00,0x00,0x38,0x00,0x03,0x23,0x00,0x00,0x00}}, +{0x00, 1 ,{0xc0}},{0xce, 14 ,{0x30,0x00,0x03,0x24,0x00,0x00,0x00,0x30,0x01,0x03,0x25,0x00,0x00,0x00}}, +{0x00, 1 ,{0xd0}},{0xce, 14 ,{0x30,0x02,0x03,0x26,0x00,0x00,0x00,0x30,0x03,0x03,0x27,0x00,0x00,0x00}}, +{0x00, 1 ,{0xc6}},{0xcf, 2 ,{0x01,0x80}}, +{0x00, 1 ,{0xc9}},{0xcf, 1 ,{0x00}}, +{0x00, 1 ,{0xc0}},{0xcb, 15 ,{0x00,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00}}, +{0x00, 1 ,{0xd0}},{0xcb, 15 ,{0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x04,0x04}}, +{0x00, 1 ,{0xe0}},{0xcb, 10 ,{0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{0x00, 1 ,{0x80}},{0xcc, 10 ,{0x00,0x26,0x25,0x02,0x06,0x00,0x00,0x0a,0x0e,0x0c}}, +{0x00, 1 ,{0x90}},{0xcc, 15 ,{0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x25,0x01,0x05}}, +{0x00, 1 ,{0xa0}},{0xcc, 15 ,{0x00,0x00,0x09,0x0d,0x0b,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{0x00, 1 ,{0xb0}},{0xcc, 10 ,{0x00,0x25,0x26,0x05,0x01,0x00,0x00,0x0f,0x0b,0x0d}}, +{0x00, 1 ,{0xc0}},{0xcc, 15 ,{0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x26,0x06,0x02}}, +{0x00, 1 ,{0xd0}},{0xcc, 15 ,{0x00,0x00,0x10,0x0c,0x0e,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +#ifdef DISPLAY_DIRECTION_0_MODE +{0x36, 1 ,{0x00}},// Display Direction 0 +{0x35, 1 ,{0x00}},// TE( Fmark ) Signal On +{0x44, 2 ,{0x01,0x22}},// TE( Fmark ) Signal Output Position +#endif + +#if 1//def DISPLAY_DIRECTION_180_MODE +{0x36, 1 ,{0xD0}},// Display Direction 180 +{0x35, 1 ,{0x00}},// TE( Fmark ) Signal On +{0x44, 2 ,{0x01,0xFF}},// TE( Fmark ) Signal Output Position +#endif + +#ifdef LCD_BACKLIGHT_CONTROL_MODE +{0x51, 1 ,{0xFF}},// Backlight Level Control +{0x53, 1 ,{0x2C}},// Backlight On +{0x55, 1 ,{0x00}},// CABC Function Off +#endif + +{0x3A, 1 ,{0x77}}, + +{0x11, 1 ,{0x00}}, +{REGFLAG_DELAY, 150, {}}, + +{0x29, 1 ,{0x00}}, +{REGFLAG_DELAY, 200, {}}, + +{0x2C, 1 ,{0x00}}, + + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 200, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz)//zhaoshaopeng from 38 + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(125); + SET_RESET_PIN(1); + MDELAY(10); + //Init_OTM8009A_BOE500_MIPI_MPU8bits(); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_resume(void) +{ + + //lcm_init(); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[2]; + unsigned int array[16]; + + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(50); + #if 1 + init_to_read_otm8009(); + #else + Init_OTM8009A_BOE500_MIPI_MPU8bits(); + #endif + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + read_reg_v2(0xda, buffer, 2); + id = buffer[0]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + if(id == LCM_ID_OMT) + { + return 1; + printk("\r\n zhaoshaopeng this is true \r\n "); + } + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER omt8009a_yashi_lcm_drv = +{ + .name = "omt8009a_yashi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/otm9608a_tm/otm9608a_tm.c b/bq_aquaris77/lcm/otm9608a_tm/otm9608a_tm.c new file mode 100755 index 0000000..1efd21f --- /dev/null +++ b/bq_aquaris77/lcm/otm9608a_tm/otm9608a_tm.c @@ -0,0 +1,913 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +//zhaoshaopeng add fn00410 lcd_id det +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xfd // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + //TIANMA 4.46 + {0x00, 1, {0x00}}, + {0xFF, 3, {0x96, 0x08, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xFF, 2, {0x96, 0x08}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x00}}, + {0xA0, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xB3, 5, {0x00,0x00,0x20,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xC0}}, + {0xB3, 1, {0x09}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xC0, 9, {0x00, 0x48, 0x00, 0x10, 0x10, 0x00, 0x48, 0x10, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x92}}, + {0xC0, 4, {0x00, 0x10, 0x00, 0x13}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xA2}}, + {0xC0, 3, {0x0C, 0x05, 0x02}}, + {REGFLAG_DELAY, 10, {}}, +// + {0x00, 1, {0xB3}}, + {0xC0, 2, {0x00, 0x50}}, + {REGFLAG_DELAY, 10, {}}, +//disable src pch + {0x00, 1, {0x87}}, + {0xC4, 1, {0x08}}, + {REGFLAG_DELAY, 10, {}}, + +// {0x00, 1, {0xB5}}, +// {0xC0, 1, {0x48}}, +// {REGFLAG_DELAY, 10, {}}, + + + {0x00, 1, {0x81}}, + {0xC1, 1, {0x55}}, //66 + {REGFLAG_DELAY, 10, {}}, + + + {0x00, 1, {0x80}}, + {0xC4, 2, {0x00, 0x84}}, + {REGFLAG_DELAY, 10, {}}, + + +// {0x00, 1, {0x88}}, +// {0xC4, 1, {0x40}},//40 +// {REGFLAG_DELAY, 10, {}}, + + + {0x00, 1, {0xA0}}, + {0xC4, 8, {0x33, 0x09, 0x90,0x2B,0x33,0x09,0x90,0x54}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xC5, 4, {0x08, 0x00, 0xA0,0x11}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x90}}, + {0xC5, 7, {0x96, 0x16, 0x01,0x79,0x33,0x33,0x34}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xA0}}, + {0xC5, 7, {0x96, 0x16, 0x00,0x79,0x33,0x33,0x34}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x00}}, + {0xD8, 2, {0x6F, 0x6F}}, //67 + {REGFLAG_DELAY, 10, {}}, +//SET VCOM + {0x00, 1, {0x00}}, + {0xD9, 1, {0x33}}, //40 + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xB0}}, + {0xC5, 2, {0x04,0xA8}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xC6, 1, {0x64}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xB0}}, + {0xC6, 5, {0x03,0x10,0x00,0x1F,0x12}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x00}}, + {0xD0, 1, {0x40}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x00}}, + {0xD1, 2, {0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xB7}}, + {0xB0, 1, {0x10}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xC0}}, + {0xB0, 1, {0x55}}, + {REGFLAG_DELAY, 10, {}}, +/////////////////////////////////////////// + {0x00, 1, {0xB1}}, + {0xB0, 1, {0x03}}, + {REGFLAG_DELAY, 10, {}}, + +// {0x00, 1, {0xF0}}, +// {0xCB, 10, {0xFF, 0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}}, +// {REGFLAG_DELAY, 10, {}}, +/////////////////////////////////////////////////////////////////////// + {0x00, 1, {0x80}}, + {0xCB, 10, {0x05,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x90}}, + {0xCB, 15, {0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xA0}}, + {0xCB, 15, {0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xB0}}, + {0xCB, 10, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xC0}}, + {0xCB, 15, {0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xD0}}, + {0xCB, 15, {0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xE0}}, + {0xCB, 10, {0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xF0}}, + {0xCB, 10, {0x0F,0x00,0xCC,0x00,0x00,0x0F,0x00,0xCC,0x03,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +/////////////////////////////////////////////////////////////////////// + {0x00, 1, {0x80}}, + {0xCC, 10, {0x25,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x90}}, + {0xCC, 15, {0x00,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x26,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xA0}}, + {0xCC, 15, {0x00,0x00,0x00,0x00,0x09,0x00,0x0B,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xB0}}, + {0xCC, 10, {0x26,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xC0}}, + {0xCC, 15, {0x00,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x25,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xD0}}, + {0xCC, 15, {0x00,0x00,0x00,0x00,0x0C,0x00,0x0A,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, +/////////////////////////////////////////////////////////////////////// + {0x00, 1, {0x80}}, + {0xCE, 12, {0x84,0x01,0x24,0x83,0x01,0x24,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x00, 1, {0x90}}, + {0xCE, 14, {0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xA0}}, + {0xCE, 14, {0x18,0x02,0x03,0xC1,0x00,0x24,0x00,0x18,0x01,0x03,0xC2,0x00,0x24,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xB0}}, + {0xCE, 14, {0x18,0x00,0x03,0xC3,0x00,0x24,0x00,0x10,0x00,0x03,0xC4,0x00,0x24,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xC0}}, + {0xCE, 14, {0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xD0}}, + {0xCE, 14, {0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, +///////////////////////////////////////////////////////////////////////////// + {0x00, 1, {0x80}}, + {0xCF, 14, {0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x90}}, + {0xCF, 14, {0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xA0}}, + {0xCF, 14, {0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xB0}}, + {0xCF, 14, {0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0xC0}}, + {0xCF, 10, {0x01,0x01,0x20,0x20,0x00,0x00,0x02,0x81,0x00,0x10}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x00}}, + {0xE1, 16, {0x08,0x11,0x19,0x0E,0x07,0x10,0x0B,0x0A,0x03,0x07,0x0C,0x09,0x0F,0x0C,0x06,0x03}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x00}}, + {0xE2, 16, {0x08,0x11,0x19,0x0E,0x07,0x10,0x0B,0x0A,0x03,0x07,0x0C,0x09,0x0F,0x0C,0x06,0x03}}, + {REGFLAG_DELAY, 10, {}}, +/* + {0x00, 1, {0x00}}, + {0xFF, 3, {0xFF,0xFF,0xFF}}, + {REGFLAG_DELAY, 10, {}}, +*/ +/* + //modify vcom dc + {0x00, 1, {0x00}}, + {0xD9, 1, {0x68}}, + {REGFLAG_DELAY, 10, {}}, +*/ +/* + {0x36, 1, {0xc0}}, + {REGFLAG_DELAY, 1, {}}, +*/ + + // +/* + {0x00, 1, {0x82}}, + {0xCE, 1, {0x0E}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0x92}}, + {0xCE, 1, {0x0E}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xA5}}, + {0xCE, 1, {0x0E}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xB5}}, + {0xCE, 1, {0x0E}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xC5}}, + {0xCE, 1, {0x09}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xC6}}, + {0xCE, 1, {0x05}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xD5}}, + {0xCE, 1, {0x09}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xD6}}, + {0xCE, 1, {0x05}}, + {REGFLAG_DELAY, 1, {}}, + + + {0x00, 1, {0x85}}, + {0xCE, 1, {0x0E}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0x95}}, + {0xCE, 1, {0x0E}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xAC}}, + {0xCE, 1, {0x0E}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xBC}}, + {0xCE, 1, {0x0E}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xCC}}, + {0xCE, 1, {0x09}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xCD}}, + {0xCE, 1, {0x05}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xDC}}, + {0xCE, 1, {0x09}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0xDD}}, + {0xCE, 1, {0x05}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0x88}}, + {0xC4, 1, {0xC0}}, + {REGFLAG_DELAY, 1, {}}, +*/ +// + {0x00, 1, {0x80}}, + {0xD6,1 ,{0x08}}, + + {0x00, 1, {0x00}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 16, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + {0xd4, 8, {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0x00, 1, {0x00}}, + {0xd5, 16, {0x00,0x60,0x00,0x60,0x00,0x5f,0x00,0x5f,0x00,0x5e,0x00,0x5e,0x00,0x5d,0x00,0x5d}}, + {0xd5, 16, {0x00,0x5d,0x00,0x5c,0x00,0x5c,0x00,0x5b,0x00,0x5b,0x00,0x5a,0x00,0x5a,0x00,0x5a}}, + {0xd5, 16, {0x00,0x5b,0x00,0x5c,0x00,0x5d,0x00,0x5d,0x00,0x5e,0x00,0x5f,0x00,0x60,0x00,0x61}}, + {0xD5, 16, {0x00,0x62,0x00,0x63,0x00,0x63,0x00,0x64,0x00,0x65,0x00,0x66,0x00,0x67,0x00,0x68}}, + {0xD5, 16, {0x00,0x69,0x00,0x69,0x00,0x6a,0x00,0x6b,0x00,0x6c,0x00,0x6d,0x00,0x6e,0x00,0x6f}}, + {0xD5, 16, {0x00,0x6f,0x00,0x70,0x00,0x71,0x00,0x72,0x00,0x73,0x00,0x74,0x00,0x74,0x00,0x75}}, + {0xD5, 16, {0x00,0x76,0x00,0x77,0x00,0x78,0x00,0x78,0x00,0x79,0x00,0x7a,0x00,0x7b,0x00,0x7c}}, + {0xD5, 16, {0x00,0x7d,0x00,0x7d,0x00,0x7e,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f}}, + {0xD5, 16, {0x00,0x7f,0x00,0x7e,0x00,0x7d,0x00,0x7c,0x00,0x7b,0x00,0x7a,0x00,0x7a,0x00,0x79}}, + {0xD5, 16, {0x00,0x78,0x00,0x77,0x00,0x76,0x00,0x76,0x00,0x75,0x00,0x74,0x00,0x73,0x00,0x72}}, + {0xD5, 16, {0x00,0x71,0x00,0x71,0x00,0x70,0x00,0x6f,0x00,0x6e,0x00,0x6d,0x00,0x6c,0x00,0x6c}}, + {0xD5, 16, {0x00,0x6b,0x00,0x6a,0x00,0x69,0x00,0x68,0x00,0x67,0x00,0x66,0x00,0x66,0x00,0x66}}, + {0xD5, 16, {0x00,0x65,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x62}}, + {0xD5, 8, {0x00,0x62,0x00,0x61,0x00,0x61,0x00,0x60}}, +/* + {0x00, 1, {0x80}}, + {0xD6, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0x80}}, + {0xD6, 1, {0x08}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0x00}}, + {0xFF, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0x01}}, + {0xFF, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + {0x00, 1, {0x02}}, + {0xFF, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, +*/ +// + + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 100, {}}, + +/* + //backlight start + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x55, 1, {0x02}}, + {REGFLAG_DELAY, 1, {}}, +*/ + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {REGFLAG_DELAY, 1, {}}, + + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, +/* + {0x53, 1, {0x2C}}, + {REGFLAG_DELAY, 1, {}}, + //backlight end +*/ + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 0, {0x00}}, + {REGFLAG_DELAY, 125, {}}, + + // Display ON + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + + // Display off sequence + {0x28, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + // Sleep Mode On + {0x10, 0, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + {0x00, 1, {0x00}}, + {0xFF, 3, {0x96, 0x08, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xFF, 2, {0x96, 0x08}}, + {REGFLAG_DELAY, 10, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + unsigned char lcd_id =0; + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + //lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + volatile unsigned int id = 0; + volatile unsigned char buffer[4]; + unsigned int array[16]; + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + unsigned char lcd_id = 0; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(150); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700; + dsi_set_cmdq(array, 1, 1); + // id = read_reg(0xF4); + read_reg_v2(0xd2, buffer, 4); + //id = buffer[0]; //we only need ID + //zhaoshaopeng for tianma/baolongda lcd_id_det hx8369 + //lcd_id = mt_get_gpio_in(GPIO_LCD_ID); + id = read_reg(0xda); + MDELAY(1); + id = read_reg(0xda); +#if defined(BUILD_UBOOT) + printf("%s, zhaoshaopeng id = 0x%08x, buf[2] = 0x%08x, buf[3] = 0x%08x,\n", __func__, id, buffer[2], buffer[3]); +#endif + if(id ==0x40) + return 1; + else + return 0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER otm9608a_tm_lcm_drv = +{ + .name = "otm9608a_tm", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + //.set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + //.esd_check = lcm_esd_check, + //.esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/bq_aquaris77/lcm/r61408/r61408.c b/bq_aquaris77/lcm/r61408/r61408.c new file mode 100644 index 0000000..fb40c12 --- /dev/null +++ b/bq_aquaris77/lcm/r61408/r61408.c @@ -0,0 +1,334 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x1408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +#if defined(LCM_DSI_CMD_MODE) + data_array[0] = 0x04B02300;//B0 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + data_array[0] = 0x00032902;//MIPI DSI Control + data_array[1] = 0x008352B6; //B6 + dsi_set_cmdq(&data_array, 2, 1); + + data_array[0] = 0x00152902;//BLC + data_array[1] = 0x090900B8; //B8 + data_array[2] = 0xe6e6ffff; + data_array[3] = 0x10101802; + data_array[4] = 0xbe875a37; + data_array[5] = 0x000000ff; + data_array[6] = 0x00000000; + dsi_set_cmdq(&data_array, 7, 1); + MDELAY(50); + + data_array[0] = 0x00052902; + data_array[1] = 0x02ff00B9; //B9 + data_array[2] = 0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + + data_array[0] = 0x00102902; // panel driving setting 2 + data_array[1] = 0x003143C1; //C1 + data_array[2] = 0x12322626; + data_array[3] = 0xA50a4a28; + data_array[4] = 0x0121580F; + dsi_set_cmdq(&data_array, 5, 1); + + data_array[0] = 0x28d62300;//D6 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00053902; + data_array[1] = 0x0100002A;//2A + data_array[2] = 0x000000DF; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(50); + + data_array[0] = 0x00053902; + data_array[1] = 0x0300002B;//2B + data_array[2] = 0x0000001f; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(50); + + data_array[0] = 0x00361500;//36 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x00351500;//36 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x773A1500;//3A + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x00110500;//11 + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(125); + + data_array[0] = 0x00290500;//29 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(125); +#endif +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + +static void lcm_init(void) +{ + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ZERO); + MDELAY(25); + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ONE); + MDELAY(50); + + init_lcm_registers(); + MDELAY(500); +// clear_panel(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; +// data_array[6]= 0x002c3901; + + dsi_set_cmdq(data_array, 7, 0); + +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + data_array[0] = 0x00052902; + data_array[1] = 0x020000B9 | (level << 16); //B9 + data_array[2] = 0x00000008; + dsi_set_cmdq(data_array, 3, 1); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[5]; + unsigned int array[16]; + //NOTE:should reset LCM firstly + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ZERO); + MDELAY(25); + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ONE); + MDELAY(50); + + array[0] = 0x00053700;// read id return 5 byte + dsi_set_cmdq(array, 1, 1); + + array[0] = 0x04B02300;// unlock for reading ID + dsi_set_cmdq(array, 1, 1); + MDELAY(50); + + read_reg_v2(0xBF, buffer, 5); + id = (buffer[2] << 8) | buffer[3]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%x\n", __func__, id); +#endif + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER r61408_lcm_drv = +{ + .name = "r61408", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id +}; + diff --git a/bq_aquaris77/lcm/r63303_idisplay/r63303_idisplay.c b/bq_aquaris77/lcm/r63303_idisplay/r63303_idisplay.c new file mode 100644 index 0000000..70444ad --- /dev/null +++ b/bq_aquaris77/lcm/r63303_idisplay/r63303_idisplay.c @@ -0,0 +1,490 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (640) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB2, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB7, 4, {0x01, 0x00, 0x05, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC4, 6, {0xDF, 0x01, 0x1C, 0x0C, + 0x00, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCA, 8, {0x01, 0x80, 0x01, 0x01, + 0x7B, 0x33, 0x03, 0x03}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCB, 7, {0x00, 0x00, 0x03, 0x20, + 0x03, 0x00, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + //{0xB2, 1, {0x03}}, + //{REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 3; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active = 16; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 12; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 16; + params->dsi.horizontal_backporch = 14; + params->dsi.horizontal_frontporch = 14; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + +#define GPIO_PIN_1V8 21 +#define GPIO_PIN_5V7 19 + +extern void DSI_clk_HS_mode(bool enter); +static unsigned int is_init = false; + +static void lcm_init(void) +{ + unsigned char buffer[5]; + unsigned int data_array[16]; + + DSI_clk_HS_mode(0); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ZERO); + + mt_set_gpio_mode(GPIO_PIN_5V7, GPIO_MODE_GPIO); + mt_set_gpio_mode(GPIO_PIN_1V8, GPIO_MODE_GPIO); + SET_RESET_PIN(0); + + mt_set_gpio_dir(GPIO_PIN_5V7, GPIO_DIR_OUT); + mt_set_gpio_dir(GPIO_PIN_1V8, GPIO_DIR_OUT); + + MDELAY(100); + + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ONE); + MDELAY(100); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ONE); + MDELAY(100); + + // SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(100); + + // Enable high speed clock + DSI_clk_HS_mode(1); + MDELAY(10); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + + data_array[0] = 0x00043700; + dsi_set_cmdq(data_array, 1, 1); + read_reg_v2(0xB7, buffer, 4); + + is_init = true; + +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ZERO); + + is_init = false; +} + + +static void lcm_resume(void) +{ + if (!is_init) + lcm_init(); + + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/bq_aquaris77/lcm/spfd5461a/spfd5461a.c b/bq_aquaris77/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..fef627b --- /dev/null +++ b/bq_aquaris77/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,385 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/bq_aquaris77/lcm/ta7601/ta7601.c b/bq_aquaris77/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..46ac606 --- /dev/null +++ b/bq_aquaris77/lcm/ta7601/ta7601.c @@ -0,0 +1,318 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/bq_aquaris77/lcm/tft1p3037/tft1p3037.c b/bq_aquaris77/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..15ced13 --- /dev/null +++ b/bq_aquaris77/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,349 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_king_s9081/lcm/bm8578/bm8578.c b/cink_king_s9081/lcm/bm8578/bm8578.c new file mode 100755 index 0000000..6b8c0cb --- /dev/null +++ b/cink_king_s9081/lcm/bm8578/bm8578.c @@ -0,0 +1,269 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_king_s9081/lcm/dummy/dummy.c b/cink_king_s9081/lcm/dummy/dummy.c new file mode 100755 index 0000000..bf92040 --- /dev/null +++ b/cink_king_s9081/lcm/dummy/dummy.c @@ -0,0 +1,110 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/cink_king_s9081/lcm/ha5266/ha5266.c b/cink_king_s9081/lcm/ha5266/ha5266.c new file mode 100755 index 0000000..cbe4cb1 --- /dev/null +++ b/cink_king_s9081/lcm/ha5266/ha5266.c @@ -0,0 +1,298 @@ +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +/* send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00);*/ +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 7; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 30; + params->dpi.hsync_back_porch = 16; + params->dpi.hsync_front_porch = 210; + params->dpi.vsync_pulse_width = 13; + params->dpi.vsync_back_porch = 10; + params->dpi.vsync_front_porch = 22; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA;; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + // init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +/* send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20);*/ +} + + +static void lcm_resume(void) +{ +/* send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900);*/ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ha5266_lcm_drv = +{ + .name = "ha5266", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_king_s9081/lcm/hsd070idw1/hsd070idw1.c b/cink_king_s9081/lcm/hsd070idw1/hsd070idw1.c new file mode 100755 index 0000000..3481787 --- /dev/null +++ b/cink_king_s9081/lcm/hsd070idw1/hsd070idw1.c @@ -0,0 +1,118 @@ +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 8; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 48; + params->dpi.hsync_back_porch = 40; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 29; + params->dpi.vsync_front_porch = 13; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + //program reset pin + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +} + + +static void lcm_suspend(void) +{ +//disable output pixel clk +} + + +static void lcm_resume(void) +{ +//enable output pixel clk +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hsd070idw1_lcm_drv = +{ + .name = "hsd070idw1", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_king_s9081/lcm/hx8357B/hx8357b.c b/cink_king_s9081/lcm/hx8357B/hx8357b.c new file mode 100755 index 0000000..babd0ed --- /dev/null +++ b/cink_king_s9081/lcm/hx8357B/hx8357b.c @@ -0,0 +1,282 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/cink_king_s9081/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c b/cink_king_s9081/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c new file mode 100755 index 0000000..3ac7fbb --- /dev/null +++ b/cink_king_s9081/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c @@ -0,0 +1,421 @@ +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, +#else//new 20120224 +{0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x0E, 0x0E, 0x21, + 0x29, 0x3F, 0x3F, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 7, {0x02, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x1C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBF, 1, {0x05, 0x60, 0x00, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xE2, 1, {0x01}},//0x01=dynamic,0x00=static + {REGFLAG_DELAY, 10, {}}, + + {0xE5, 1, {0x15}},//0x15 L, 0x16 M, 0x17 H + {REGFLAG_DELAY, 10, {}}, +#endif + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + // SET GAMMA + #if 0 + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x85, 0x89, 0xCC, 0xD1, + 0xD6, 0x15, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x85, 0x89, 0xCC, + 0xD1, 0xD6, 0x15, 0x15, + 0x12, 0x18}}, +#else//new 20120224 +{0xE0, 34, {0x00, 0x06, 0x0A, 0x12, + 0x15, 0x3B, 0x1D, 0x34, + 0x87, 0x8E, 0xCC, 0xCF, + 0xCE, 0x0E, 0x12, 0x11, + 0x18, 0x00, 0x06, 0x0A, + 0x12, 0x15, 0x3B, 0x1D, + 0x34, 0x87, 0x8E, 0xCC, + 0xCF, 0xCE, 0x0E, 0x12, + 0x11, 0x18}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x14}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x00,0X03}},//17.143kHz + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +/* +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +*/ + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_mode_setting[] = { + {0x55, 1, {0x1}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setbacklight_mode(unsigned int mode) +{ + lcm_backlight_mode_setting[0].para_list[0] = mode; + push_table(lcm_backlight_mode_setting, sizeof(lcm_backlight_mode_setting) / sizeof(struct LCM_setting_table), 1); +} + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, +#else//new 20120224 +{0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x0E, 0x0E, 0x21, + 0x29, 0x3F, 0x3F, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 7, {0x02, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x1C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBF, 1, {0x05, 0x60, 0x00, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xE2, 1, {0x01}},//0x01=dynamic,0x00=static + {REGFLAG_DELAY, 10, {}}, + + {0xE5, 1, {0x15}},//0x15 L, 0x16 M, 0x17 H + {REGFLAG_DELAY, 10, {}}, +#endif + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + // SET GAMMA + #if 0 + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x85, 0x89, 0xCC, 0xD1, + 0xD6, 0x15, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x85, 0x89, 0xCC, + 0xD1, 0xD6, 0x15, 0x15, + 0x12, 0x18}}, +#else//new 20120224 +{0xE0, 34, {0x00, 0x06, 0x0A, 0x12, + 0x15, 0x3B, 0x1D, 0x34, + 0x87, 0x8E, 0xCC, 0xCF, + 0xCE, 0x0E, 0x12, 0x11, + 0x18, 0x00, 0x06, 0x0A, + 0x12, 0x15, 0x3B, 0x1D, + 0x34, 0x87, 0x8E, 0xCC, + 0xCF, 0xCE, 0x0E, 0x12, + 0x11, 0x18}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x14}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x00,0X03}},//17.143kHz + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +/* +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +*/ + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_mode_setting[] = { + {0x55, 1, {0x1}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setbacklight_mode(unsigned int mode) +{ + lcm_backlight_mode_setting[0].para_list[0] = mode; + push_table(lcm_backlight_mode_setting, sizeof(lcm_backlight_mode_setting) / sizeof(struct LCM_setting_table), 1); +} + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0xff);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x02);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + sw_clear_panel(0); + send_ctrl_cmd(0x10); + MDELAY(5); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + send_ctrl_cmd(0xC3); + send_data_cmd(0xFF); + + send_ctrl_cmd(0xF4); + read_data_cmd(); + return (LCM_ID == read_data_cmd())?1:0; +} + +LCM_DRIVER hx8369_6575_lcm_drv = +{ + .name = "hx8369_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id, +}; + + diff --git a/cink_king_s9081/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c b/cink_king_s9081/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c new file mode 100755 index 0000000..96be0d4 --- /dev/null +++ b/cink_king_s9081/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c @@ -0,0 +1,477 @@ +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, ///apply it as ESD indication + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[2]; + unsigned int array[16]; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + read_reg_v2(0xF4, buffer, 2); + id = buffer[0]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hx8369_dsi_6575_lcm_drv = +{ + .name = "hx8369_dsi_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + .set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + .esd_check = lcm_esd_check, + .esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/cink_king_s9081/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c b/cink_king_s9081/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c new file mode 100755 index 0000000..d4e707b --- /dev/null +++ b/cink_king_s9081/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c @@ -0,0 +1,392 @@ +#include + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include ///for printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include ///for printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 5, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 5, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 5, {}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 5, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active = 3; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +/* // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING;*/ +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XAA +#define REGFLAG_END_OF_TABLE 0xAB // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[128]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + + {0xB1, 10, {0x12, 0x83, 0x77, 0x00, + 0x8F, 0x0F, 0x1A, 0x1A, + 0x0C, 0x0A}}, + + {0xB2, 3, {0x00, 0x10, 0x02}}, + + {0xB3, 4, {0x83, 0x00, 0x31, 0x03}}, + + {0xB4, 1, {0x42}}, + + {0xB6, 2, {0x7F, 0x7F}}, + + {0xE3, 4, {0x01, 0x01, 0x01, 0x01}}, + + {0xC0, 6, {0x73, 0x50, 0x00, 0x3C, + 0xC4, 0x00}}, + + {0xCC, 1, {0x00}}, + +#if 1 + {0xD5, 92, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#else + {0xD5, 59, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00}}, + + {0xFD, 34, { + 0xAA, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#endif + +#if 0 + {0xD5, 56, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00}}, + + {0xFD, 38, {0xAA, 0xAA, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#endif + + {0xE0, 35, {0x00, 0x0C, 0x00, 0x10, + 0x14, 0x3C, 0x27, 0x34, + 0x0C, 0x10, 0x11, 0x15, + 0x18, 0x16, 0x16, 0x13, + 0x18, 0x0C, 0x00, 0x0C, + 0x10, 0x14, 0x3C, 0x27, + 0x34, 0x0C, 0x10, 0x11, + 0x15, 0x18, 0x16, 0x16, + 0x13, 0x18, 0x01}}, + + {0xEA, 1, {0x62}}, + + {0x3A, 1, {0x77}}, + + {0xBA, 15, {0x11, 0x00, 0x16, 0xC6, + 0x00, 0x0A, 0x00, 0x10, + 0x24, 0x02, 0x21, 0x21, + 0x9A, 0x17, 0x1D}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i, j, k; + unsigned int para_int, read_int; + unsigned char buffer[256]; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); +#if 0 + do { + read_int = read_reg(cmd); + para_int = *((unsigned int *)table[i].para_list); + printf("%s, compare = {%04x, %04x} \n", __func__, read_int, para_int); + } while(read_int != para_int); +#endif + } + } + +#if 0//defined(BUILD_UBOOT) + int remain_bytes; + int r_byte_count; + unsigned int array[16]; + + for(i = 0; i < count; i++) { + if(table[i].cmd != REGFLAG_DELAY && table[i].cmd != REGFLAG_END_OF_TABLE) + { + remain_bytes = table[i].count; + j = 0; + + do { + //printf("Read 0x%02x round %d. Remain %d bytes \n", table[i].cmd, j, remain_bytes); + r_byte_count = (remain_bytes > 8) ? 8 : remain_bytes; + + array[0] = 0x00003700 | (r_byte_count<<16);// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + + if(j>0) + read_reg_v2(0xFD, (buffer + j*8), r_byte_count); + else + read_reg_v2(table[i].cmd, buffer, r_byte_count); + + j++; + remain_bytes-=8; + } while(remain_bytes>0); + + printf("0x%02X[%02d] => { ", table[i].cmd, table[i].count); + for(k = 0; k < table[i].count; k++) + { + if((k % 4 ) == 0 && k > 0) + printf("\n ", buffer[k]); + printf("0x%02X ", buffer[k]); + } + printf("} \n"); + + } + } +#endif + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; +#if 0 + params->dsi.vertical_sync_active = 10; + params->dsi.vertical_backporch = 10; + params->dsi.vertical_frontporch = 10; // 2 + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 50; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; +#else + params->dsi.vertical_sync_active = 4; + params->dsi.vertical_backporch = 17; + params->dsi.vertical_frontporch = 17; // 2 + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 17; + params->dsi.horizontal_backporch = 49; + params->dsi.horizontal_frontporch = 57; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; +#endif + // Bit rate calculation + params->dsi.pll_div1=28; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + + +static void lcm_init(void) +{ + unsigned char buffer[10]; + unsigned int array[16]; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // AUO 3.17" + ILI9481 + + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); + send_data_cmd(0X0007); + send_data_cmd(0X0041); + send_data_cmd(0X001B); + + send_ctrl_cmd(0X00D1); + send_data_cmd(0X0000); + send_data_cmd(0X0016); // 0x001b + send_data_cmd(0X0012); + + send_ctrl_cmd(0X00D2); + send_data_cmd(0X0001); + send_data_cmd(0X0011); + + send_ctrl_cmd(0X00C0); + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X00F3); + send_data_cmd(0X0040); + send_data_cmd(0X000A); + send_ctrl_cmd(0X00F6); + send_data_cmd(0X0080); + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0080); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x29); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, +}; diff --git a/cink_king_s9081/lcm/inc/lcm_drv.h b/cink_king_s9081/lcm/inc/lcm_drv.h new file mode 100755 index 0000000..070b161 --- /dev/null +++ b/cink_king_s9081/lcm/inc/lcm_drv.h @@ -0,0 +1,504 @@ +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), + LCM_DRIVING_CURRENT_6575_4MA = (1 << 4), + LCM_DRIVING_CURRENT_6575_8MA = (3 << 4), + LCM_DRIVING_CURRENT_6575_12MA = (2 << 4), + LCM_DRIVING_CURRENT_6575_16MA = (4 << 4) +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4, + LCM_DBI_DATA_WIDTH_32BITS = 5 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; + + +/* DSI related enumerations */ + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_DSI_FORMAT_RGB565 = 0, + LCM_DSI_FORMAT_RGB666 = 1, + LCM_DSI_FORMAT_RGB888 = 2 +} LCM_DSI_FORMAT; + + +typedef enum +{ + LCM_DSI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DSI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DSI_TRANS_SEQ; + + +typedef enum +{ + LCM_DSI_PADDING_ON_LSB = 0, + LCM_DSI_PADDING_ON_MSB = 1 +} LCM_DSI_PADDING; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +////////////////////////////////////MT6575 added params, and if lcm driver is for 6575, only care these below params + unsigned int css; + unsigned int csh; + unsigned int rd_1st; + unsigned int rd_2nd; + unsigned int wr_1st; + unsigned int wr_2nd; + + unsigned int sif_3wire; + unsigned int sif_sdi; + LCM_POLARITY sif_1st_pol; + LCM_POLARITY sif_sck_def; + unsigned int sif_div2; + unsigned int sif_hw_cs; +//////////////////////////////////// +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_hold; + unsigned int read_latency; + unsigned int wait_period; + /*only for 6575*/ + unsigned int cs_high_width; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DSI_TRANS_SEQ trans_seq; + LCM_DSI_PADDING padding; + LCM_DSI_FORMAT format; +} LCM_DSI_DATA_FORMAT; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + unsigned int i2x_en; + unsigned int i2x_edge; + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + + LCM_LANE_NUM LANE_NUM; + LCM_DSI_DATA_FORMAT data_format; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int packet_size; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int horizontal_sync_active; + unsigned int horizontal_backporch; + unsigned int horizontal_frontporch; + unsigned int horizontal_active_pixel; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; + + unsigned int lcm_int_te_monitor; + unsigned int lcm_int_te_period; + + unsigned int lcm_ext_te_monitor; + + unsigned int noncont_clock; + unsigned int noncont_clock_period; + +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq_V2)(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update); + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + unsigned int (*dsi_dcs_read_lcm_reg)(unsigned char cmd); + unsigned int (*dsi_dcs_read_lcm_reg_v2)(unsigned char cmd, unsigned char *buffer, unsigned char buffer_size); + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned char pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); +///////////////////////////CABC backlight related function + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + void (*set_backlight_mode)(unsigned int mode); +/////////////////////////// + +/////////////ESD_RECOVERY////////////////////// + unsigned int (*esd_check)(void); + unsigned int (*esd_recover)(void); + +///////////////////////////////////////////////// + //edit by Magnum used for debug LCD + void (*m_debug)(char * buf); + +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/cink_king_s9081/lcm/lg4571/lg4571.c b/cink_king_s9081/lcm/lg4571/lg4571.c new file mode 100755 index 0000000..22c7dea --- /dev/null +++ b/cink_king_s9081/lcm/lg4571/lg4571.c @@ -0,0 +1,331 @@ +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_king_s9081/lcm/lt4015w_dsi/lt4015w_dsi.c b/cink_king_s9081/lcm/lt4015w_dsi/lt4015w_dsi.c new file mode 100644 index 0000000..7c2d07d --- /dev/null +++ b/cink_king_s9081/lcm/lt4015w_dsi/lt4015w_dsi.c @@ -0,0 +1,925 @@ + + +#include + +#if defined(BUILD_UBOOT) + #include + #define LCM_PRINT printf + #ifndef KERN_INFO + #define KERN_INFO + #endif +#else + #include + #include + #define LCM_PRINT printk +#endif + +#if 1 +#define LCM_DBG(fmt, arg...) \ + LCM_PRINT("[LCM-LT4015W-DSI] %s (line:%d) :" fmt "\r\n", __func__, __LINE__, ## arg) +#else +#define LCM_DBG(fmt, arg...) do {} while (0) +#endif + +#include "lcm_drv.h" + +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFA // END OF REGISTERS MARKER + +#define LCM_ID_OTM8009A 0x8009 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +static int i = 0; //used for CE d400h, edit by Magnum 2012-7-17 +unsigned char mm[2] = {0x00,0x00}; +//enable CE -- Color enhance edit by Magnum 2012-7-16 + //define par1 and par2. +unsigned char par1[360] = { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40} ; + unsigned char par2[360] = { 0x00,0x6a,0x00,0x69,0x00,0x68,0x00,0x67,0x00,0x66,0x00,0x66, + 0x00,0x66,0x00,0x65,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x63, + 0x00,0x63,0x00,0x63,0x00,0x62,0x00,0x62,0x00,0x61,0x00,0x61, + 0x00,0x60,0x00,0x5d,0x00,0x5e,0x00,0x5f,0x00,0x60,0x00,0x61, + 0x00,0x62,0x00,0x63,0x00,0x63,0x00,0x64,0x00,0x65,0x00,0x66, + 0x00,0x67,0x00,0x69,0x00,0x6b,0x00,0x6c,0x00,0x6e,0x00,0x70, + 0x00,0x71,0x00,0x73,0x00,0x75,0x00,0x76,0x00,0x78,0x00,0x7a, + 0x00,0x7b,0x00,0x7d,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7e,0x00,0x7d,0x00,0x7c,0x00,0x7a,0x00,0x79, + 0x00,0x78,0x00,0x77,0x00,0x75,0x00,0x74,0x00,0x73,0x00,0x72, + 0x00,0x71,0x00,0x6f,0x00,0x6e,0x00,0x6d,0x00,0x6b,0x00,0x69, + 0x00,0x68,0x00,0x66,0x00,0x64,0x00,0x63,0x00,0x61,0x00,0x5f, + 0x00,0x5d,0x00,0x5c,0x00,0x5a,0x00,0x58,0x00,0x57,0x00,0x55}; + + + + + + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_V2(cmd,buffer,buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd,buffer,buffer_size) + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[360]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + +{0x00, 1 ,{0x00}}, +{0xff, 3 ,{0x80,0x09,0x01}}, // enable EXTC + +{0x00, 1 ,{0x80}}, +{0xff, 2 ,{0x80,0x09}}, // enable Orise mode + +{0x00, 1 ,{0x80}}, +{0xf5, 12,{0x01,0x14,0x02,0x14,0x10,0x14,0x02,0x14,0x0e,0x14,0x0f,0x20}}, +{REGFLAG_DELAY, 10, {}}, + +{0x00, 1 ,{0x90}}, +{0xf5, 10,{0x02,0x14,0x08,0x14,0x06,0x14,0x0d,0x14,0x0b,0x14}}, +{REGFLAG_DELAY, 10, {}}, + +{0x00, 1 ,{0xa0}}, +{0xf5, 8 ,{0x10,0x14,0x01,0x14,0x14,0x14,0x14,0x14}}, +{REGFLAG_DELAY, 10, {}}, + +{0x00, 1 ,{0xb0}}, +{0xf5, 12,{0x14,0x14,0x12,0x14,0x13,0x14,0x11,0x14,0x13,0x14,0x00,0x00}}, +{REGFLAG_DELAY, 10, {}}, + +{0x00 ,1 ,{0x80}}, +{0xc4, 1 ,{0x30}}, // Source gnd +{REGFLAG_DELAY, 10, {}}, + +{0x00 ,1 ,{0x8A}}, +{0xc4, 1 ,{0x40}}, // Source gnd +{REGFLAG_DELAY, 10, {}}, + + + // Column Inversion + {0x00, 1, {0xB4}}, + {0xc0, 1, {0x10}}, // 50 lie rotation ,10 point rotation edit by Magnum 2012-8-22 + {REGFLAG_DELAY, 10, {}}, + + // pump45 01->X6X6 00->X8X6 + {0x00, 1, {0x92}}, + {0xc5, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + //pump1 X2 ratio + {0x00, 1, {0x90}}, + {0xc5, 1, {0x96}}, + {REGFLAG_DELAY, 10, {}}, + + // pump34 CLK Line Rate + {0x00, 1, {0x95}}, + {0xc5, 1, {0x34}}, + {REGFLAG_DELAY, 10, {}}, + + // pump12 clk freq(Normal) + {0x00, 1, {0x94}}, + {0xc5, 1, {0x33}}, + {REGFLAG_DELAY, 10, {}}, + + // source pch + {0x00, 1, {0xa3}}, + {0xc0, 1, {0x1b}}, + {REGFLAG_DELAY, 10, {}}, + + // REG-Pump23 AVEE VCL + {0x00, 1, {0x82}}, + {0xc5, 1, {0x83}}, + {REGFLAG_DELAY, 10, {}}, + + // source bias + {0x00, 1, {0x81}}, + {0xc4, 1, {0x83}}, + {REGFLAG_DELAY, 10, {}}, + + // VDD_18V=1.6V GVDD test on + {0x00, 1, {0xb1}}, + {0xc5, 1, {0xa9}}, + {REGFLAG_DELAY, 10, {}}, + + // [7:4]VGH level=12.5V, [3:0]VGL level=-13V (setting value for worst pattern) + {0x00, 1, {0x91}}, + {0xc5, 1, {0x2b}}, + {REGFLAG_DELAY, 10, {}}, + + // GVDD 4.625V + {0x00, 1, {0x00}}, + {0xd8, 1, {0x79}}, + {REGFLAG_DELAY, 10, {}}, + + // NGVDD -4.625V + {0x00, 1, {0x01}}, + {0xd8, 1, {0x79}}, + {REGFLAG_DELAY, 10, {}}, + + // Frame rate = 70Hz + {0x00, 1, {0x81}}, + {0xc1, 1, {0x66}}, + {REGFLAG_DELAY, 10, {}}, + + // VS, HS, DE for PORTB + {0x00, 1, {0xa1}}, + {0xc1, 1, {0x0e}}, + {REGFLAG_DELAY, 10, {}}, + + // VCOM + {0x00, 1, {0x00}}, + {0xd9, 1, {0x3e}}, + {REGFLAG_DELAY, 10, {}}, + + +//----------------------------------------------------------------------------- +// gamma setting +//------------------------------------------------------------------------ +//e10x + + {0x00, 1, {0x00}}, + {0xe1, 16, {0x00,0x0a,0x10,0x0d,0x06,0x10,0x0b,0x0a,0x03,0x06,0x0b,0x08,0x0f,0x12,0x0d,0x03}}, + {REGFLAG_DELAY, 10, {}}, + +//e20x + + {0x00, 1, {0x00}}, + {0xe2, 16, {0x00,0x0a,0x10,0x0d,0x06,0x10,0x0b,0x0a,0x03,0x06,0x0b,0x08,0x0f,0x12,0x0d,0x03}}, + {REGFLAG_DELAY, 10, {}}, + + + + //-------------------------------------------------------------------------------- +// initial setting 2 < tcon_goa_wave > +//-------------------------------------------------------------------------------- + + // CE8x : vst1, vst2, vst3, vst4 + // shift address + {0x00, 1, {0x80}}, + {0xce, 12, {0x86,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +//CEAx : clka1, clka2 + // shift address + {0x00, 1, {0xa0}}, + {0xce, 14, {0x18,0x04,0x03,0x21,0x00,0x00,0x00,0x18,0x03,0x03,0x22,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +//CEBx : clka3, clka4 + // shift address + {0x00, 1, {0xb0}}, + {0xce, 14, {0x18,0x02,0x03,0x23,0x00,0x00,0x00,0x18,0x01,0x03,0x24,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +//CFCx : + + {0x00, 1, {0xc0}}, + {0xcf, 10, {0x01,0x01,0x20,0x20,0x00,0x00,0x01,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +//CFDx : + // shift address + + + {0x00, 1, {0xd0}}, + {0xcf, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- + + +// cbcx + // shift address + {0x00, 1, {0xc0}}, + {0xcb, 15, {0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +// cbdx + // shift address + {0x00, 1, {0xd0}}, + {0xcb, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00}}, + + + + + {REGFLAG_DELAY, 10, {}}, + + +// cbex + // shift address + {0x00, 1, {0xe0}}, + {0xcb, 10, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + + +// cc8x + // shift address + {0x00, 1, {0x80}}, + {0xcc, 10, {0x00,0x26,0x09,0x0b,0x01,0x25,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +// cc9x + // shift address + + {0x00, 1, {0x90}}, + {0xcc, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0a,0x0c,0x02}}, + {REGFLAG_DELAY, 10, {}}, + +// ccax + // shift address + + {0x00, 1, {0xa0}}, + {0xcc, 15, {0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +// ccbx + // shift address + + {0x00, 1, {0xb0}}, + {0xcc, 10, {0x00,0x25,0x0c,0x0a,0x02,0x26,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +// cccx + // shift address + + {0x00, 1, {0xc0}}, + {0xcc, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0b,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + //open TE Magnum + {0x35, 1, {0x00}}, //TE On + + + {0x00, 1, {0x00}}, + {0x44, 2, {0x01,0x22}}, + + // {0x21, 1, {0x00}}, //Display off for Test Magnum 2012-7-16 + + //open CE -- Color enhance Magnum 2012-7-16 + {0x00,1,{0x80}}, + {0xd6,1, {0x08}}, + + {0x00, 1, {0x00}}, + + + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, // NO == 360 + + {0x00, 1, {0x00}}, + {0xd5, 60, { 0x00, 0x60, 0x00, 0x60, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5e, 0x00, 0x5e, 0x00, + 0x5d, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5b, 0x00, 0x5b, + 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, + 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, + 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66}}, + + {0xd5, 60, { 0x00, 0x67, 0x00, 0x68, 0x00, + 0x69, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, + 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, + 0x74, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x78, + 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7d, 0x00, + 0x7e, 0x00, 0x7f}}, + + {0xd5, 60, { 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f}}, + + {0xd5, 60, { 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f}}, + + {0xd5, 60, { 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7e, 0x00, 0x7d, 0x00, 0x7c, 0x00, 0x7b, 0x00, 0x7a, 0x00, 0x7a, + 0x00, 0x79, 0x00, 0x78, 0x00, 0x77, 0x00, 0x76, 0x00, 0x76, 0x00, 0x75, 0x00, + 0x74}}, + + {0xd5, 60, { 0x00, 0x73, 0x00, 0x72, 0x00, 0x71, 0x00, 0x71, 0x00, 0x70, 0x00, 0x6f, + 0x00, 0x6e, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6b, 0x00, 0x6a, 0x00, + 0x69, 0x00, 0x68, 0x00, 0x67, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x65, + 0x00, 0x65, 0x00, 0x64, 0x00, 0x64, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, + 0x62, 0x00, 0x62, 0x00, 0x61, 0x00, 0x61, 0x00, 0x60}}, +/* {0x00, 1, {0x00}}, + {0xd5, 360, {0x00, 0x53, 0x00, 0x53, 0x00, 0x52, 0x00, 0x52, 0x00, 0x51, 0x00, 0x51, 0x00, + 0x51, 0x00, 0x50, 0x00, 0x50, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4e, + 0x00, 0x4e, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, + 0x51, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, + 0x00, 0x57, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5a, 0x00, + 0x5b, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5d, + 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x60, 0x00, + 0x60, 0x00, 0x61, 0x00, 0x61, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x63, + 0x00, 0x63, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x65, 0x00, + 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, + 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, + 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, + 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, + 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, + 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, + 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, + 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, + 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, + + 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, + 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, + 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, + 0x66, 0x00, 0x66, 0x00, 0x65, 0x00, 0x65, 0x00, 0x64, 0x00, 0x64, 0x00, 0x63, + 0x00, 0x63, 0x00, 0x63, 0x00, 0x62, 0x00, 0x62, 0x00, 0x61, 0x00, 0x61, 0x00, + 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5e, 0x00, 0x5e, + 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5b, 0x00, + 0x5b, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x59, 0x00, 0x59, 0x00, 0x58, + 0x00, 0x58, 0x00, 0x57, 0x00, 0x57, 0x00, 0x57, 0x00, 0x56, 0x00, 0x56, 0x00, + 0x55, 0x00, 0x55, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54}}, */ + + + + +// ccdx + // shift address + + {0x00, 1, {0xd0}}, + {0xcc, 15, {0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x11,1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + {0x29,1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + + //#VScan + + //(vodeo mode&command mode) + //{0xB1, 2, {0xF8,0x00}}, + //0512-87172138-7122, 15950021248 + //(only command mode) +//Ivan {0xB1, 2, {0xE8,0x00}}, +//Ivan {REGFLAG_DELAY, 1, {}}, + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +//add by wuhai for change LCD scanning direction +static struct LCM_setting_table lcm_scanning_direction_setting[] = { + {0x0b,1,{0xc0}}, + {0x36,1,{0xd0}}, + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +//add end +static struct LCM_setting_table lcm_compare_id_setting[] = { + + {0x00, 1, {0x00}}, + {0xff, 3, {0x80,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xff, 3, {0x80,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x02}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} + + +// array[1]=0x010980ff; +// array[2]=0x80001500; +// array[3]=0x00033902; +// array[4]=0x010980ff; +}; + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) + { + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +//Ivan added +#define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + +static void lcm_get_params(LCM_PARAMS *params) +{ +// unsigned int cycle_time = (8 * 1000 * div2_real)/ (26 * (div1+0x01)); +// unsigned int ui = (1000 * div2_real)/ (26 * (div1+0x01)) + 1; + unsigned int cycle_time = (8 * 1000 * 2)/ (26 * (26+0x01)); //~= 22.79ns + unsigned int ui = (1000 * 2)/ (26 * (26+0x01)) + 1; //~=3.84 + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; + + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + +#if (LCM_DSI_CMD_MODE) + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + //edit by Magnum 2012-7-4 try to solve lcd not updating.... + params->dsi.HS_TRAIL=0x08; + params->dsi.HS_ZERO=0x07; + params->dsi.HS_PRPR=0x03; + params->dsi.LPX=0x04; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x14; + params->dsi.TA_SURE=0x06; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x04; + params->dsi.CLK_ZERO=0x0f; + params->dsi.LPX_WAIT=0x01; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x04; + +//Ivan added +// params->dsi.HS_TRAIL=NS_TO_CYCLE(60 +4*ui + 10, cycle_time); //Page 272 +// params->dsi.HS_ZERO=NS_TO_CYCLE(40 +4*ui + 10, cycle_time); //Page 272 + params->dsi.HS_PRPR=NS_TO_CYCLE(105 +6*ui + 10, cycle_time); //Page 272 +// params->dsi.LPX=NS_TO_CYCLE(50 + 10, cycle_time); //Page 272 + +// params->dsi.TA_SACK=0x01; +// params->dsi.TA_GET=NS_TO_CYCLE(6*58, cycle_time); //min 5*58 + params->dsi.TA_SURE=NS_TO_CYCLE(80, cycle_time); //min 58 ; max 2*58 +// params->dsi.TA_GO=NS_TO_CYCLE(5*58, cycle_time); //min 4*58 + +// params->dsi.CLK_TRAIL=NS_TO_CYCLE(60 + 10, cycle_time); //min 60 +// params->dsi.CLK_ZERO=NS_TO_CYCLE(300, cycle_time); //min 300 -60 + params->dsi.CLK_HS_PRPR=NS_TO_CYCLE(60, cycle_time); //min 38 ; max 95 + +// params->dsi.LPX_WAIT=0x01; // +// params->dsi.CONT_DET=0x00; + + //params->dsi.pll_div1=30; + //params->dsi.pll_div2=1; + + +#else + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 20; + params->dsi.horizontal_frontporch = 40; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + +#endif + // Bit rate calculation + params->dsi.pll_div1=30;//34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvco/(2*div2) +//Ivan ~351MHz +} + + +static void lcm_init(void) +{ + LCM_DBG(); + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(100); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + + if(0 == strncmp(TINNO_PROJECT_NAME, "S9070", 5)) + push_table(lcm_scanning_direction_setting, sizeof(lcm_scanning_direction_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + LCM_DBG(); + + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + // Work around for Novatek driver IC. If it entered ULP mode, it must be reset before resume. +// lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + if(0 == strncmp(TINNO_PROJECT_NAME, "S9070", 5)) + push_table(lcm_scanning_direction_setting, sizeof(lcm_scanning_direction_setting) / sizeof(struct LCM_setting_table), 1); +// push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ +//Ivan LCM_DBG("UPDATE-UPDATE-UPDATE"); + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + +static unsigned int lt4015w_cmp_id(void) +{ + unsigned int id=0; + unsigned char buffer[2]; + unsigned int array[16]; + + +//reset before read id + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + +// + /* array[0]=0x00043902; + array[1]=0x010980ff; + array[2]=0x80001500; + array[3]=0x00033902; + array[4]=0x010980ff; + dsi_set_cmdq(array, 5, 1); + MDELAY(10); + + + + array[0] = 0x02001500; // + dsi_set_cmdq(array, 1, 1); */ + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + array[0] = 0x00023700;// set return byte number + dsi_set_cmdq(array, 1, 1); + + + // MDELAY(10); + + read_reg_V2(0xD2, &buffer, 2); + + id = buffer[0]<<8 |buffer[1]; + + LCM_DBG("[Magnum] -- otm8009a 0x%x , 0x%x , 0x%x \n",buffer[0],buffer[1],id); + + return (id == LCM_ID_OTM8009A)?1:0; + +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lt4015w_dsi_lcm_drv = +{ + .name = "lt4015w", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif + .compare_id = lt4015w_cmp_id, +}; diff --git a/cink_king_s9081/lcm/lt4015w_thai_dsi/lt4015w_thai_dsi.c b/cink_king_s9081/lcm/lt4015w_thai_dsi/lt4015w_thai_dsi.c new file mode 100644 index 0000000..6c1517f --- /dev/null +++ b/cink_king_s9081/lcm/lt4015w_thai_dsi/lt4015w_thai_dsi.c @@ -0,0 +1,879 @@ + + +#include + +#if defined(BUILD_UBOOT) + #include + #define LCM_PRINT printf + #ifndef KERN_INFO + #define KERN_INFO + #endif +#else + #include + #include + #define LCM_PRINT printk +#endif + +#if 1 +#define LCM_DBG(fmt, arg...) \ + LCM_PRINT("[LCM-LT4015W-DSI] %s (line:%d) :" fmt "\r\n", __func__, __LINE__, ## arg) +#else +#define LCM_DBG(fmt, arg...) do {} while (0) +#endif + +#include "lcm_drv.h" + +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFA // END OF REGISTERS MARKER + +#define LCM_ID_OTM8009A 0x8009 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +static int i = 0; //used for CE d400h, edit by Magnum 2012-7-17 +unsigned char mm[2] = {0x00,0x00}; +//enable CE -- Color enhance edit by Magnum 2012-7-16 + //define par1 and par2. +unsigned char par1[360] = { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40} ; + unsigned char par2[360] = { 0x00,0x6a,0x00,0x69,0x00,0x68,0x00,0x67,0x00,0x66,0x00,0x66, + 0x00,0x66,0x00,0x65,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x63, + 0x00,0x63,0x00,0x63,0x00,0x62,0x00,0x62,0x00,0x61,0x00,0x61, + 0x00,0x60,0x00,0x5d,0x00,0x5e,0x00,0x5f,0x00,0x60,0x00,0x61, + 0x00,0x62,0x00,0x63,0x00,0x63,0x00,0x64,0x00,0x65,0x00,0x66, + 0x00,0x67,0x00,0x69,0x00,0x6b,0x00,0x6c,0x00,0x6e,0x00,0x70, + 0x00,0x71,0x00,0x73,0x00,0x75,0x00,0x76,0x00,0x78,0x00,0x7a, + 0x00,0x7b,0x00,0x7d,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f,0x00,0x7f, + 0x00,0x7f,0x00,0x7e,0x00,0x7d,0x00,0x7c,0x00,0x7a,0x00,0x79, + 0x00,0x78,0x00,0x77,0x00,0x75,0x00,0x74,0x00,0x73,0x00,0x72, + 0x00,0x71,0x00,0x6f,0x00,0x6e,0x00,0x6d,0x00,0x6b,0x00,0x69, + 0x00,0x68,0x00,0x66,0x00,0x64,0x00,0x63,0x00,0x61,0x00,0x5f, + 0x00,0x5d,0x00,0x5c,0x00,0x5a,0x00,0x58,0x00,0x57,0x00,0x55}; + + + + + + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_V2(cmd,buffer,buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd,buffer,buffer_size) + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[360]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + +{0x00, 1 ,{0x00}}, +{0xff, 3 ,{0x80,0x09,0x01}}, // enable EXTC + +{0x00, 1 ,{0x80}}, +{0xff, 2 ,{0x80,0x09}}, // enable Orise mode + +{0x00, 1 ,{0x80}}, +{0xf5, 12,{0x01,0x14,0x02,0x14,0x10,0x14,0x02,0x14,0x0e,0x14,0x0f,0x20}}, +{REGFLAG_DELAY, 10, {}}, + +{0x00, 1 ,{0x90}}, +{0xf5, 10,{0x02,0x14,0x08,0x14,0x06,0x14,0x0d,0x14,0x0b,0x14}}, +{REGFLAG_DELAY, 10, {}}, + +{0x00, 1 ,{0xa0}}, +{0xf5, 8 ,{0x10,0x14,0x01,0x14,0x14,0x14,0x14,0x14}}, +{REGFLAG_DELAY, 10, {}}, + +{0x00, 1 ,{0xb0}}, +{0xf5, 12,{0x14,0x14,0x12,0x14,0x13,0x14,0x11,0x14,0x13,0x14,0x00,0x00}}, +{REGFLAG_DELAY, 10, {}}, + +{0x00 ,1 ,{0x80}}, +{0xc4, 1 ,{0x30}}, // Source gnd +{REGFLAG_DELAY, 10, {}}, + +{0x00 ,1 ,{0x8A}}, +{0xc4, 1 ,{0x40}}, // Source gnd +{REGFLAG_DELAY, 10, {}}, + + + // Column Inversion + {0x00, 1, {0xB4}}, + {0xc0, 1, {0x10}}, // 50 lie rotation ,10 point rotation edit by Magnum 2012-8-22 + {REGFLAG_DELAY, 10, {}}, + + + // pump45 01->X6X6 00->X8X6 + {0x00, 1, {0x92}}, + {0xc5, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + //pump1 X2 ratio + {0x00, 1, {0x90}}, + {0xc5, 1, {0x96}}, + {REGFLAG_DELAY, 10, {}}, + + // pump34 CLK Line Rate + {0x00, 1, {0x95}}, + {0xc5, 1, {0x34}}, + {REGFLAG_DELAY, 10, {}}, + + // pump12 clk freq(Normal) + {0x00, 1, {0x94}}, + {0xc5, 1, {0x33}}, + {REGFLAG_DELAY, 10, {}}, + + // source pch + {0x00, 1, {0xa3}}, + {0xc0, 1, {0x1b}}, + {REGFLAG_DELAY, 10, {}}, + + // REG-Pump23 AVEE VCL + {0x00, 1, {0x82}}, + {0xc5, 1, {0x83}}, + {REGFLAG_DELAY, 10, {}}, + + // source bias + {0x00, 1, {0x81}}, + {0xc4, 1, {0x83}}, + {REGFLAG_DELAY, 10, {}}, + + // VDD_18V=1.6V GVDD test on + {0x00, 1, {0xb1}}, + {0xc5, 1, {0xa9}}, + {REGFLAG_DELAY, 10, {}}, + + // [7:4]VGH level=12.5V, [3:0]VGL level=-13V (setting value for worst pattern) + {0x00, 1, {0x91}}, + {0xc5, 1, {0x2b}}, + {REGFLAG_DELAY, 10, {}}, + + // GVDD 4.625V + {0x00, 1, {0x00}}, + {0xd8, 1, {0x79}}, + {REGFLAG_DELAY, 10, {}}, + + // NGVDD -4.625V + {0x00, 1, {0x01}}, + {0xd8, 1, {0x79}}, + {REGFLAG_DELAY, 10, {}}, + + // Frame rate = 70Hz + {0x00, 1, {0x81}}, + {0xc1, 1, {0x66}}, + {REGFLAG_DELAY, 10, {}}, + + // VS, HS, DE for PORTB + {0x00, 1, {0xa1}}, + {0xc1, 1, {0x0e}}, + {REGFLAG_DELAY, 10, {}}, + + // VCOM + {0x00, 1, {0x00}}, + {0xd9, 1, {0x3e}}, + {REGFLAG_DELAY, 10, {}}, + +//----------------------------------------------------------------------------- +// gamma setting +//------------------------------------------------------------------------ +//e10x + + {0x00, 1, {0x00}}, + {0xe1, 16, {0x00,0x0a,0x10,0x0d,0x06,0x10,0x0b,0x0a,0x03,0x06,0x0b,0x08,0x0f,0x12,0x0d,0x03}}, + {REGFLAG_DELAY, 10, {}}, + +//e20x + + {0x00, 1, {0x00}}, + {0xe2, 16, {0x00,0x0a,0x10,0x0d,0x06,0x10,0x0b,0x0a,0x03,0x06,0x0b,0x08,0x0f,0x12,0x0d,0x03}}, + {REGFLAG_DELAY, 10, {}}, + + + + //-------------------------------------------------------------------------------- +// initial setting 2 < tcon_goa_wave > +//-------------------------------------------------------------------------------- + + // CE8x : vst1, vst2, vst3, vst4 + // shift address + {0x00, 1, {0x80}}, + {0xce, 12, {0x86,0x01,0x00,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +//CEAx : clka1, clka2 + // shift address + {0x00, 1, {0xa0}}, + {0xce, 14, {0x18,0x04,0x03,0x21,0x00,0x00,0x00,0x18,0x03,0x03,0x22,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +//CEBx : clka3, clka4 + // shift address + {0x00, 1, {0xb0}}, + {0xce, 14, {0x18,0x02,0x03,0x23,0x00,0x00,0x00,0x18,0x01,0x03,0x24,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +//CFCx : + + {0x00, 1, {0xc0}}, + {0xcf, 10, {0x01,0x01,0x20,0x20,0x00,0x00,0x01,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +//CFDx : + // shift address + + + {0x00, 1, {0xd0}}, + {0xcf, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- + + +// cbcx + // shift address + {0x00, 1, {0xc0}}, + {0xcb, 15, {0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + +// cbdx + // shift address + {0x00, 1, {0xd0}}, + {0xcb, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00}}, + + {REGFLAG_DELAY, 10, {}}, + + +// cbex + // shift address + {0x00, 1, {0xe0}}, + {0xcb, 10, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + + +// cc8x + // shift address + {0x00, 1, {0x80}}, + {0xcc, 10, {0x00,0x26,0x09,0x0b,0x01,0x25,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +// cc9x + // shift address + + {0x00, 1, {0x90}}, + {0xcc, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0a,0x0c,0x02}}, + {REGFLAG_DELAY, 10, {}}, + +// ccax + // shift address + + {0x00, 1, {0xa0}}, + {0xcc, 15, {0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +// ccbx + // shift address + + {0x00, 1, {0xb0}}, + {0xcc, 10, {0x00,0x25,0x0c,0x0a,0x02,0x26,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + +// cccx + // shift address + + {0x00, 1, {0xc0}}, + {0xcc, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0b,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + //open TE Magnum + {0x35, 1, {0x00}}, //TE On + + {0x00, 1, {0x00}}, + {0x44, 2, {0x01,0x22}}, + +// {0x21, 1, {0x00}}, //Display off for Test Magnum 2012-7-16 + + //open CE -- Color enhance Magnum 2012-7-16 +/* {0x00,1,{0x80}}, + {0xd6,1, {0x08}}, + + {0x00, 1, {0x00}}, + + + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, + + {0xd4, 60, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40}}, // NO == 360 + + {0x00, 1, {0x00}}, + {0xd5, 60, { 0x00, 0x60, 0x00, 0x60, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5e, 0x00, 0x5e, 0x00, + 0x5d, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5b, 0x00, 0x5b, + 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, + 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, + 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66}}, + + {0xd5, 60, { 0x00, 0x67, 0x00, 0x68, 0x00, + 0x69, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, + 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, + 0x74, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x78, + 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7d, 0x00, + 0x7e, 0x00, 0x7f}}, + + {0xd5, 60, { 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f}}, + + {0xd5, 60, { 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f}}, + + {0xd5, 60, { 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, + 0x7f, 0x00, 0x7e, 0x00, 0x7d, 0x00, 0x7c, 0x00, 0x7b, 0x00, 0x7a, 0x00, 0x7a, + 0x00, 0x79, 0x00, 0x78, 0x00, 0x77, 0x00, 0x76, 0x00, 0x76, 0x00, 0x75, 0x00, + 0x74}}, + + {0xd5, 60, { 0x00, 0x73, 0x00, 0x72, 0x00, 0x71, 0x00, 0x71, 0x00, 0x70, 0x00, 0x6f, + 0x00, 0x6e, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6b, 0x00, 0x6a, 0x00, + 0x69, 0x00, 0x68, 0x00, 0x67, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x65, + 0x00, 0x65, 0x00, 0x64, 0x00, 0x64, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, + 0x62, 0x00, 0x62, 0x00, 0x61, 0x00, 0x61, 0x00, 0x60}}, */ + + + + +// ccdx + // shift address + + {0x00, 1, {0xd0}}, + {0xcc, 15, {0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x11,1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + {0x29,1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + + //#VScan + + //(vodeo mode&command mode) + //{0xB1, 2, {0xF8,0x00}}, + //0512-87172138-7122, 15950021248 + //(only command mode) +//Ivan {0xB1, 2, {0xE8,0x00}}, +//Ivan {REGFLAG_DELAY, 1, {}}, + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + + {0x00, 1, {0x00}}, + {0xff, 3, {0x80,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xff, 3, {0x80,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x02}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} + + +// array[1]=0x010980ff; +// array[2]=0x80001500; +// array[3]=0x00033902; +// array[4]=0x010980ff; +}; + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) + { + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +//Ivan added +#define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + +static void lcm_get_params(LCM_PARAMS *params) +{ +// unsigned int cycle_time = (8 * 1000 * div2_real)/ (26 * (div1+0x01)); +// unsigned int ui = (1000 * div2_real)/ (26 * (div1+0x01)) + 1; + unsigned int cycle_time = (8 * 1000 * 2)/ (26 * (26+0x01)); //~= 22.79ns + unsigned int ui = (1000 * 2)/ (26 * (26+0x01)) + 1; //~=3.84 + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; + + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + +#if (LCM_DSI_CMD_MODE) + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + //edit by Magnum 2012-7-4 try to solve lcd not updating.... + params->dsi.HS_TRAIL=0x08; + params->dsi.HS_ZERO=0x07; + params->dsi.HS_PRPR=0x03; + params->dsi.LPX=0x04; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x14; + params->dsi.TA_SURE=0x06; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x04; + params->dsi.CLK_ZERO=0x0f; + params->dsi.LPX_WAIT=0x01; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x04; + +//Ivan added +// params->dsi.HS_TRAIL=NS_TO_CYCLE(60 +4*ui + 10, cycle_time); //Page 272 +// params->dsi.HS_ZERO=NS_TO_CYCLE(40 +4*ui + 10, cycle_time); //Page 272 + params->dsi.HS_PRPR=NS_TO_CYCLE(105 +6*ui + 10, cycle_time); //Page 272 +// params->dsi.LPX=NS_TO_CYCLE(50 + 10, cycle_time); //Page 272 + +// params->dsi.TA_SACK=0x01; +// params->dsi.TA_GET=NS_TO_CYCLE(6*58, cycle_time); //min 5*58 + params->dsi.TA_SURE=NS_TO_CYCLE(80, cycle_time); //min 58 ; max 2*58 +// params->dsi.TA_GO=NS_TO_CYCLE(5*58, cycle_time); //min 4*58 + +// params->dsi.CLK_TRAIL=NS_TO_CYCLE(60 + 10, cycle_time); //min 60 +// params->dsi.CLK_ZERO=NS_TO_CYCLE(300, cycle_time); //min 300 -60 + params->dsi.CLK_HS_PRPR=NS_TO_CYCLE(60, cycle_time); //min 38 ; max 95 + +// params->dsi.LPX_WAIT=0x01; // +// params->dsi.CONT_DET=0x00; + + //params->dsi.pll_div1=30; + //params->dsi.pll_div2=1; + + +#else + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 20; + params->dsi.horizontal_frontporch = 40; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + +#endif + // Bit rate calculation + params->dsi.pll_div1=30;//34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvco/(2*div2) +//Ivan ~351MHz +} + + +static void lcm_init(void) +{ + LCM_DBG(); + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(100); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + LCM_DBG(); + + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + // Work around for Novatek driver IC. If it entered ULP mode, it must be reset before resume. +// lcm_init(); + LCM_DBG(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + +// push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ +//Ivan LCM_DBG("UPDATE-UPDATE-UPDATE"); + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + +static unsigned int lt4015w_cmp_id(void) +{ + unsigned int id=0; + unsigned char buffer[2]; + unsigned int array[16]; + + +//reset before read id + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + +// + /* array[0]=0x00043902; + array[1]=0x010980ff; + array[2]=0x80001500; + array[3]=0x00033902; + array[4]=0x010980ff; + dsi_set_cmdq(array, 5, 1); + MDELAY(10); + + + + array[0] = 0x02001500; // + dsi_set_cmdq(array, 1, 1); */ + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + array[0] = 0x00023700;// set return byte number + dsi_set_cmdq(array, 1, 1); + + + // MDELAY(10); + + read_reg_V2(0xD2, &buffer, 2); + + id = buffer[0]<<8 |buffer[1]; + + LCM_DBG("[Magnum] -- otm8009a 0x%x , 0x%x , 0x%x \n",buffer[0],buffer[1],id); + + return (id == LCM_ID_OTM8009A)?1:0; + +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lt4015w_thai_dsi_lcm_drv = +{ + .name = "lt4015w_Thai", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif + .compare_id = lt4015w_cmp_id, +}; diff --git a/cink_king_s9081/lcm/lt5002f_dsi/lt5002f_dsi.c b/cink_king_s9081/lcm/lt5002f_dsi/lt5002f_dsi.c new file mode 100755 index 0000000..3916829 --- /dev/null +++ b/cink_king_s9081/lcm/lt5002f_dsi/lt5002f_dsi.c @@ -0,0 +1,882 @@ + + +#include + +#if defined(BUILD_UBOOT) + #include + #define LCM_PRINT printf + #ifndef KERN_INFO + #define KERN_INFO + #endif +#else + #include + #include + #define LCM_PRINT printk +#endif + +#if 1 +#define LCM_DBG(fmt, arg...) \ + LCM_PRINT("[LCM-lt5002f-DSI] %s (line:%d) :" fmt "\r\n", __func__, __LINE__, ## arg) +#else +#define LCM_DBG(fmt, arg...) do {} while (0) +#endif + +#include "lcm_drv.h" + +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFA // END OF REGISTERS MARKER + +#define LCM_ID_OTM8009A 0x8009 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +//edit by Magnum 2012-10-12 solve screen not update when ESD (+/- 10kv) +#define CHECK_LCM_MODE + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +static unsigned int lt5002f_cmp_id(void); +static unsigned int test_cmp_id(void); +static unsigned int check_display_normal(void); + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_V2(cmd,buffer,buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd,buffer,buffer_size) + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[360]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + // enable EXTC + {0x00, 1, {0x00}}, + {0xff, 3, {0x80,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + + // shift address + {0x00, 1, {0x80}}, + // enable Orise mode + {0xff, 2, {0x80,0x09}}, + + + + // Column Inversion + {0x00, 1, {0x03}}, + {0xFF, 1, {0x01}}, + + + + // pump45 01->X6X6 00->X8X6 + {0x00, 1, {0x90}}, + {0xB3, 1, {0x02}}, + + + //pump1 X2 ratio + {0x00, 1, {0x92}}, + {0xB3, 1, {0x45}}, + + + // pump34 CLK Line Rate + {0x00, 1, {0xA6}}, + {0xB3, 2, {0x20,0X01}}, + + + // pump12 clk freq(Normal) + {0x00, 1, {0xA3}}, + {0xc0, 1, {0x1B}}, + + + // source pch + {0x00, 1, {0xB4}}, + {0xc0, 1, {0x50}}, + + + // REG-Pump23 AVEE VCL + + {0x00, 1, {0x81}}, + {0xc4, 1, {0x04}}, + + + {0x00, 1, {0xB4}}, + {0xc0, 1, {0x10}}, // 50 lie rotation ,10 point rotation edit by Magnum 2012-8-22 + + + + // source bias + {0x00, 1, {0x80}}, + {0xc5, 1, {0x03}}, + + + // VDD_18V=1.6V GVDD test on + {0x00, 1, {0x82}}, + {0xc5, 1, {0x03}}, + + + // [7:4]VGH level=12.5V, [3:0]VGL level=-13V (setting value for worst pattern) + {0x00, 1, {0x90}}, + {0xc5, 5, {0x96,0X2B,0X04,0X7B,0X33}}, + + + // GVDD 4.625V + {0x00, 1, {0x00}}, + {0xd8, 1, {0x70}}, + + + // NGVDD -4.625V + {0x00, 1, {0x01}}, + {0xd8, 1, {0x70}}, + + + // Frame rate = 70Hz + {0x00, 1, {0x00}}, + {0xD9, 1, {0x2F}}, + + + // VS, HS, DE for PORTB + {0x00, 1, {0x81}}, + {0xc1, 1, {0x66}}, + + + // VCOM +// {0x00, 1, {0x00}}, +// {0xd9, 1, {0x3e}}, +// + +//----------------------------------------------------------------------------- +// gamma setting +//------------------------------------------------------------------------ +//e10x + + {0x00, 1, {0x00}}, + {0xe1, 16, {0x08,0x13,0x19,0x0d,0x06,0x0D,0x0A,0x08,0x05,0x08,0x0E,0x09,0x0f,0x0D,0x07,0x03}}, + + +//e20x + + {0x00, 1, {0x00}}, + {0xe2, 16, {0x08,0x13,0x19,0x0D,0X06,0X0D,0x0A,0x08,0x05,0x08,0x0E,0x09,0x0F,0x0D,0x07,0x03}}, + + + + + //-------------------------------------------------------------------------------- +// initial setting 2 < tcon_goa_wave > +//-------------------------------------------------------------------------------- + + // CE8x : vst1, vst2, vst3, vst4 + // shift address + {0x00, 1, {0x80}}, + {0xce, 12, {0x85,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + + + +//CEAx : clka1, clka2 + // shift address + {0x00, 1, {0xa0}}, + {0xce, 14, {0x18,0x02,0x03,0x59,0x00,0x00,0x00,0x18,0x01,0x03,0x5A,0x00,0x00,0x00}}, + + + +//CEBx : clka3, clka4 + // shift address + {0x00, 1, {0xb0}}, + {0xce, 14, {0x18,0x04,0x03,0x5B,0x00,0x00,0x00,0x18,0x03,0x03,0x5C,0x00,0x00,0x00}}, + + + +//CFCx : + + {0x00, 1, {0xc0}}, + {0xcf, 10, {0x01,0x01,0x20,0x20,0x00,0x00,0x01,0x02,0x10,0x00}}, + + +//CFDx : + // shift address + + + {0x00, 1, {0xd0}}, + {0xcf, 1, {0x00}}, + + + +//-------------------------------------------------------------------------------- +// initial setting 3 < Panel setting > +//-------------------------------------------------------------------------------- + + +// cbcx + // shift address + {0x00, 1, {0x80}}, + {0xcb, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + + + +// cbdx + // shift address + {0x00, 1, {0x90}}, + {0xcb, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + + + +// cbex + // shift address + {0x00, 1, {0xA0}}, + {0xcb, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + + + {0x00, 1, {0xB0}}, + {0xCB, 10, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + + + {0x00, 1, {0xC0}}, + {0xCB, 15, {0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + + + {0x00, 1, {0xD0}}, + {0xCB, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00}}, + + +// cccx + // shift address + + {0x00, 1, {0xe0}}, + {0xcb, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + + + {0x00, 1, {0xf0}}, + {0xcb, 10, {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}}, + + + {0x00, 1, {0x80}}, + {0xcc, 10, {0x00,0x26,0x09,0x0b,0x01,0x25,0x00,0x00,0x00,0x00}}, + + + {0x00, 1, {0x90}}, + {0xcc, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0a,0x0c,0x02}}, + + + {0x00, 1, {0xa0}}, + {0xcc, 15, {0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x0a,0x0c,0x02}}, + + + {0x00, 1, {0xb0}}, + {0xcc, 10, {0x00,0x25,0x0a,0x0c,0x02,0x26,0x00,0x00,0x00,0x00}}, + + + {0x00, 1, {0xc0}}, + {0xcc, 15, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x09,0x0b,0x01}}, + + + {0x00, 1, {0xd0}}, + {0xcc, 15, {0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + + + //open TE Magnum + {0x35, 1, {0x00}}, //TE On + + {0x00, 1, {0x00}}, + {0x44, 2, {0x01,0x22}}, + + // {0x21, 1, {0x00}}, //Display off for Test Magnum 2012-7-16 +#if 0 + //open CE -- Color enhance Magnum 2012-7-16 + {0x00,1,{0x80}}, + {0xd6,1, {0x08}}, + + {0x00, 1, {0x00}}, + + + + {0xd4, 40, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0xd4, 40, { + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0xd4, 40, { + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0xd4, 40, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0xd4, 40, { + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0xd4, 40, { + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0xd4, 40, { 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0xd4, 40, { + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, + + {0xd4, 40, { + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40}}, // NO == 360 + + {0x00, 1, {0x00}}, + {0xd5, 40, { 0x00, 0x60, 0x00, 0x60, 0x00, 0x5f, 0x00, 0x5f, + 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x5d, 0x00, 0x5d, + 0x00, 0x5d, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5b, + 0x00, 0x5b, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x5a, + 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5d}}, + + {0xd5, 40, { + 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, + 0x00, 0x62, 0x00, 0x63, 0x00, 0x63, 0x00, 0x64, + 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, + 0x00, 0x69, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6b, + 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x6f, }}, + + {0xd5, 40, { + 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, + 0x00, 0x73, 0x00, 0x74, 0x00, 0x74, 0x00, 0x75, + 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x78, + 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, + 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f}}, + + {0xd5, 40, { 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f}}, + + {0xd5, 40, { + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f }}, + + {0xd5, 40, { + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f}}, + + {0xd5, 40, { 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x7d, 0x00, 0x7c}}, + + {0xd5, 40, { + 0x00, 0x7b, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x79, + 0x00, 0x78, 0x00, 0x77, 0x00, 0x76, 0x00, 0x76, + 0x00, 0x75, 0x00, 0x74, 0x00, 0x73, 0x00, 0x72, + 0x00, 0x71, 0x00, 0x71, 0x00, 0x70, 0x00, 0x6f, + 0x00, 0x6e, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6c,}}, + + {0xd5, 40, { + 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x68, + 0x00, 0x67, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, + 0x00, 0x65, 0x00, 0x65, 0x00, 0x64, 0x00, 0x64, + 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x62, + 0x00, 0x62, 0x00, 0x61, 0x00, 0x61, 0x00, 0x60}}, +#endif + {0x11,1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + {0x29,1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + + {0x00, 1, {0x00}}, + {0xff, 3, {0x80,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x80}}, + {0xff, 3, {0x80,0x09,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1, {0x02}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} + + +// array[1]=0x010980ff; +// array[2]=0x80001500; +// array[3]=0x00033902; +// array[4]=0x010980ff; +}; + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) + { + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +//Ivan added +#define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + +static void lcm_get_params(LCM_PARAMS *params) +{ +// unsigned int cycle_time = (8 * 1000 * div2_real)/ (26 * (div1+0x01)); +// unsigned int ui = (1000 * div2_real)/ (26 * (div1+0x01)) + 1; + unsigned int cycle_time = (8 * 1000 * 2)/ (26 * (26+0x01)); //~= 22.79ns + unsigned int ui = (1000 * 2)/ (26 * (26+0x01)) + 1; //~=3.84 + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + +#if (LCM_DSI_CMD_MODE) + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + //edit by Magnum 2012-7-4 try to solve lcd not updating.... + params->dsi.HS_TRAIL=0x08; + params->dsi.HS_ZERO=0x07; + params->dsi.HS_PRPR=0x03; + params->dsi.LPX=0x04; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x14; + params->dsi.TA_SURE=0x06; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x04; + params->dsi.CLK_ZERO=0x0f; + params->dsi.LPX_WAIT=0x01; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x04; +/* +//Ivan added +// params->dsi.HS_TRAIL=NS_TO_CYCLE(60 +4*ui + 10, cycle_time); //Page 272 +// params->dsi.HS_ZERO=NS_TO_CYCLE(40 +4*ui + 10, cycle_time); //Page 272 + params->dsi.HS_PRPR=NS_TO_CYCLE(105 +6*ui + 10, cycle_time); //Page 272 +// params->dsi.LPX=NS_TO_CYCLE(50 + 10, cycle_time); //Page 272 + +// params->dsi.TA_SACK=0x01; +// params->dsi.TA_GET=NS_TO_CYCLE(6*58, cycle_time); //min 5*58 + params->dsi.TA_SURE=NS_TO_CYCLE(80, cycle_time); //min 58 ; max 2*58 +// params->dsi.TA_GO=NS_TO_CYCLE(5*58, cycle_time); //min 4*58 + +// params->dsi.CLK_TRAIL=NS_TO_CYCLE(60 + 10, cycle_time); //min 60 +// params->dsi.CLK_ZERO=NS_TO_CYCLE(300, cycle_time); //min 300 -60 + params->dsi.CLK_HS_PRPR=NS_TO_CYCLE(60, cycle_time); //min 38 ; max 95 + +// params->dsi.LPX_WAIT=0x01; // +// params->dsi.CONT_DET=0x00; + + //params->dsi.pll_div1=30; + //params->dsi.pll_div2=1; + */ + +#else + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 20; + params->dsi.horizontal_frontporch = 40; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + +#endif + // Bit rate calculation + params->dsi.pll_div1=0x1A;//34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + LCM_DBG(); + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(50); + SET_RESET_PIN(1); + MDELAY(100); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + LCM_DBG(); + + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + // Work around for Novatek driver IC. If it entered ULP mode, it must be reset before resume./ lcm_init(); + LCM_DBG(); +// lcm_init(); + if(test_cmp_id()) + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + else + lcm_init(); + // int dd = check_display_normal(); +// LCM_DBG("[LSQ] --check_display_normal() == %d \n ",dd); +// push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + // LCM_DBG("UPDATE-UPDATE-UPDATE"); + + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + + +} + +static unsigned int lt5002f_cmp_id(void) +{ + unsigned int id=0; + unsigned char buffer[2]; + unsigned int array[16]; + + +//reset before read id + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + +// + /* array[0]=0x00043902; + array[1]=0x010980ff; + array[2]=0x80001500; + array[3]=0x00033902; + array[4]=0x010980ff; + dsi_set_cmdq(array, 5, 1); + MDELAY(10); + + + + array[0] = 0x02001500; // + dsi_set_cmdq(array, 1, 1); */ + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + array[0] = 0x00023700;// set return byte number + dsi_set_cmdq(array, 1, 1); + + + // MDELAY(10); + + read_reg_V2(0xD2, &buffer, 2); + + id = buffer[0]<<8 |buffer[1]; + + LCM_DBG("[Magnum] -- otm8009a 0x%x , 0x%x , 0x%x \n",buffer[0],buffer[1],id); + + return (id == LCM_ID_OTM8009A)?1:0; + +} + +static unsigned int test_cmp_id(void) +{ + unsigned int id=0; + unsigned char buffer[2]; + unsigned int array[16]; + + +//reset before read id + array[0]=0x00043902; + array[1]=0x010980ff; + array[2]=0x80001500; + array[3]=0x00033902; + array[4]=0x010980ff; + dsi_set_cmdq(array, 5, 1); + MDELAY(10); + + array[0] = 0x02001500; + dsi_set_cmdq(array, 1, 1); + + + array[0] = 0x00023700;// set return byte number + dsi_set_cmdq(array, 1, 1); + + read_reg_V2(0xD2, &buffer, 2); + + id = buffer[0]<<8 |buffer[1]; + + LCM_DBG("[LSQ] -- otm8009a 0x%x , 0x%x , 0x%x \n",buffer[0],buffer[1],id); + + return (id == LCM_ID_OTM8009A)?1:0; + +} + +static unsigned int lcm_esd_check(void) +{ + unsigned int ret=0; + ret = test_cmp_id(); + if (ret) + return 0; + return 1; + +} + + +static unsigned int check_display_normal(void) +{ + unsigned int normal=0; + unsigned char buffer1[1]; + unsigned char buffer2[1]; + unsigned char buffer3[1]; + unsigned char buffer4[1]; + unsigned int array[16]; + array[0] = 0x00013700;// set return byte number + dsi_set_cmdq(array, 1, 1); + + read_reg_V2(0x0A, &buffer1, 1); + read_reg_V2(0x0B, &buffer2, 1); + read_reg_V2(0x0C, &buffer3, 1); + read_reg_V2(0x0D, &buffer4, 1); +// normal = buffer[0]; + LCM_DBG("[LSQ] --test ic normal == 0x%x , 0x%x , 0x%x , 0x%x\n",buffer1[0],buffer2[0],buffer3[0],buffer4[0]); + if(buffer1[0] == 0x9c && buffer2[0] == 0x0 && buffer3[0] == 0x7 && buffer4[0] == 0x0) + return 1; + else + return 0; +} + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lt5002f_dsi_lcm_drv = +{ + .name = "lt5002f_otm8009a_24bits", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif +#ifdef CHECK_LCM_MODE + .esd_check = lcm_esd_check, + .esd_recover = lcm_init, +#endif + .compare_id = lt5002f_cmp_id, +}; diff --git a/cink_king_s9081/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c b/cink_king_s9081/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c new file mode 100755 index 0000000..1c5e97d --- /dev/null +++ b/cink_king_s9081/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c @@ -0,0 +1,217 @@ +#include +#ifdef BUILD_UBOOT +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#else +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + //SET_RESET_PIN(0); + //MDELAY(10); + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(50); + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + + +static void lcm_suspend(void) +{ + //SET_RESET_PIN(0); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ZERO); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + MDELAY(10); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + MDELAY(10); + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ZERO); // LCM_STBY + MDELAY(10); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST + MDELAY(10); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(50); + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE + MDELAY(120); // avoid LCD resume transint +} + +LCM_DRIVER lvds_wsvga_ti_lcm_drv = +{ + .name = "lvds_wsvga_ti", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/cink_king_s9081/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c b/cink_king_s9081/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c new file mode 100755 index 0000000..2a61587 --- /dev/null +++ b/cink_king_s9081/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c @@ -0,0 +1,216 @@ +#include +#ifdef BUILD_UBOOT +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#else +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + //SET_RESET_PIN(0); + //MDELAY(10); + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(120); + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + + +static void lcm_suspend(void) +{ + //SET_RESET_PIN(0); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ZERO); // HDMI_POWER_EN + + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + //MDELAY(10); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + MDELAY(10); + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ZERO); // LCM_STBY + MDELAY(10); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST + MDELAY(10); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(120); + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + +LCM_DRIVER lvds_wsvga_ti_n_lcm_drv = +{ + .name = "lvds_wsvga_ti_n", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/cink_king_s9081/lcm/mt65xx_lcm_list.c b/cink_king_s9081/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..f33ac60 --- /dev/null +++ b/cink_king_s9081/lcm/mt65xx_lcm_list.c @@ -0,0 +1,210 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER hx8369_6575_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_hvga_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER nt35582_mcu_6575_lcm_drv; +extern LCM_DRIVER nt35582_rgb_6575_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_hvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_qvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369b_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER ha5266_lcm_drv; +extern LCM_DRIVER hsd070idw1_lcm_drv; +extern LCM_DRIVER lg4571_lcm_drv; +extern LCM_DRIVER lvds_wsvga_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_n_lcm_drv; +extern LCM_DRIVER nt35565_3d_lcm_drv; +extern LCM_DRIVER tm070ddh03_lcm_drv; +extern LCM_DRIVER r61408_lcm_drv; +extern LCM_DRIVER nt35510_lcm_drv; +extern LCM_DRIVER nt35510_hvga_lcm_drv; +extern LCM_DRIVER nt35510_qvga_lcm_drv; +extern LCM_DRIVER nt35510_6517_lcm_drv; +extern LCM_DRIVER nt35510_dsi_lcm_drv; +extern LCM_DRIVER lt4015w_dsi_lcm_drv; +extern LCM_DRIVER lt5002f_dsi_lcm_drv; +extern LCM_DRIVER r63303_idisplay_lcm_drv; +extern LCM_DRIVER lt4015w_thai_dsi_lcm_drv; +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(LT4015W_DSI) + <4015w_dsi_lcm_drv, +#endif + +#if defined(LT4015W_THAI_DSI) + <4015w_thai_dsi_lcm_drv, +#endif + +#if defined(LT5002F_DSI) + <5002f_dsi_lcm_drv, +#endif + +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(HX8369_6575) + &hx8369_6575_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(NT35582_MCU_6575) + &nt35582_mcu_6575_lcm_drv, +#endif + +#if defined(NT35582_RGB_6575) + &nt35582_rgb_6575_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(R61408) + &r61408_lcm_drv, +#endif + +#if defined(HX8369_DSI_VDO) + &hx8369_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI) + &hx8369_dsi_6575_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_HVGA) + &hx8369_dsi_6575_hvga_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_QVGA) + &hx8369_dsi_6575_qvga_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(NT35510) + &nt35510_lcm_drv, +#endif + +#if defined(NT35510_HVGA) + &nt35510_hvga_lcm_drv, +#endif + +#if defined(NT35510_QVGA) + &nt35510_qvga_lcm_drv, +#endif + +#if defined(NT35510_6517) + &nt35510_6517_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(HA5266) + &ha5266_lcm_drv, +#endif + +#if defined(HSD070IDW1) + &hsd070idw1_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI) + &hx8363_6575_dsi_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI_HVGA) + &hx8363_6575_dsi_hvga_lcm_drv, +#endif + +#if defined(LG4571) + &lg4571_lcm_drv, +#endif + +#if defined(LVDS_WSVGA) + &lvds_wsvga_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI) + &lvds_wsvga_ti_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI_N) + &lvds_wsvga_ti_n_lcm_drv, +#endif + +#if defined(NT35565_3D) + &nt35565_3d_lcm_drv, +#endif + +#if defined(TM070DDH03) + &tm070ddh03_lcm_drv, +#endif + +#if defined(NT35510_DSI) + &nt35510_dsi_lcm_drv, +#endif + +#if defined(R63303_IDISPLAY) + &r63303_idisplay_lcm_drv, +#endif + +#if defined(HX8369B_DSI_VDO) + &hx8369b_dsi_vdo_lcm_drv, +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/cink_king_s9081/lcm/mtk_cust.mk b/cink_king_s9081/lcm/mtk_cust.mk new file mode 100755 index 0000000..c180615 --- /dev/null +++ b/cink_king_s9081/lcm/mtk_cust.mk @@ -0,0 +1,3 @@ +# Used for UBOOT +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/cink_king_s9081/lcm/nt35510/nt35510.c b/cink_king_s9081/lcm/nt35510/nt35510.c new file mode 100755 index 0000000..828b017 --- /dev/null +++ b/cink_king_s9081/lcm/nt35510/nt35510.c @@ -0,0 +1,569 @@ +#include +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Bit rate calculation + params->dsi.pll_div1=34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + params->dsi.HS_TRAIL = 10;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_ZERO = 8;//min 105ns+6*UI + params->dsi.HS_PRPR = 4;//min 40ns+4*UI; max 85ns+6UI + params->dsi.LPX = 12;//min 50ns + + params->dsi.TA_GO = 12;//4*LPX + + params->dsi.CLK_TRAIL = 5;//min 60ns + params->dsi.CLK_ZERO = 18;//min 300ns-38ns + params->dsi.LPX_WAIT = 10; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = 4;//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00053902; + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00123902; + data_array[1]=0x000201F8; + data_array[2]=0x00133320; + data_array[3]=0x23000040; + data_array[4]=0x00C89902; + data_array[5]=0x00001100; + dsi_set_cmdq(data_array, 6, 1); + + +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(data_array, 2, 1); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00B21500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(data_array, 2, 1); + + //data_array[0]=0x01BF1500; + //dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x242424BA; + dsi_set_cmdq(data_array, 2, 1); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(data_array, 2, 1); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(data_array, 1, 1); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(data_array, 1, 1); +// MDELAY(10); +/* + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(data_array, 1, 1); +*/ +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(10); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, %d\n", __func__, level); +#else + printk("lcm_setbacklight = %d\n", level); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + lcm_init(); + data_array[0]=0x00110500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0]=0x00290500; + dsi_set_cmdq(data_array, 1, 1); +} + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Bit rate calculation + params->dsi.pll_div1=34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + params->dsi.HS_TRAIL = 10;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_ZERO = 8;//min 105ns+6*UI + params->dsi.HS_PRPR = 4;//min 40ns+4*UI; max 85ns+6UI + params->dsi.LPX = 12;//min 50ns + + params->dsi.TA_GO = 12;//4*LPX + + params->dsi.CLK_TRAIL = 5;//min 60ns + params->dsi.CLK_ZERO = 18;//min 300ns-38ns + params->dsi.LPX_WAIT = 10; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = 4;//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + + +//AVDD: 5.0V + data_array[0]=0x00043902; + data_array[1]=0x0A0A0AB0; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x444444B6; + dsi_set_cmdq(data_array, 2, 1); + +//AVEE: -5.0V + data_array[0]=0x00043902; + data_array[1]=0x0A0A0AB1; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x343434B7; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x242424B9; + dsi_set_cmdq(data_array, 2, 1); + +//#VGLX:-13V + data_array[0]=0x00043902; + data_array[1]=0x080808B5; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x141414BA; + dsi_set_cmdq(data_array, 2, 1); + +//#VGMP:4.7V /VGSP:0V + data_array[0]=0x00043902; + data_array[1]=0x008800BC; + dsi_set_cmdq(data_array, 2, 1); + +//#VGMN:-4.7V /VGSN:0V + data_array[0]=0x00043902; + data_array[1]=0x008800BD; + dsi_set_cmdq(data_array, 2, 1); + +//##VCOM Setting + data_array[0]=0x00033902; + data_array[1]=0x002D00BE; + dsi_set_cmdq(data_array, 2, 1); + +//VCL + data_array[0]=0x00043902; + data_array[1]=0x020202B2; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x242424B8; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + +//# R+ + data_array[0]=0x00353902; + data_array[1]=0x002900D1; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FA02EF; + data_array[14]=0x00000060; + dsi_set_cmdq(data_array, 15, 1); + +//#G + + data_array[0]=0x00353902; + data_array[1]=0x002900D2; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FD02EF; + data_array[14]=0x00000000; + dsi_set_cmdq(data_array, 15, 1); + +//#B + + data_array[0]=0x00353902; + data_array[1]=0x002900D3; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x02F502EF; + data_array[14]=0x000000D0; + dsi_set_cmdq(data_array, 15, 1); + +//#R - + data_array[0]=0x00353902; + data_array[1]=0x002900D4; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FA02EF; + data_array[14]=0x00000060; + dsi_set_cmdq(data_array, 15, 1); + +//#G - + data_array[0]=0x00353902; + data_array[1]=0x002900D5; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FD02EF; + data_array[14]=0x00000000; + dsi_set_cmdq(data_array, 15, 1); + +//#B - + data_array[0]=0x00353902; + data_array[1]=0x002900D6; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x02F502EF; + data_array[14]=0x000000D0; + dsi_set_cmdq(data_array, 15, 1); +//####### ENABLE PAGE 0 ############ + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); +//################################### +//#Vivid Color + data_array[0]=0x10B41500; + dsi_set_cmdq(data_array, 1, 1); + +//#480*854 + data_array[0]=0x6CB51500; + dsi_set_cmdq(data_array, 1, 1); + +//#SDT + data_array[0]=0x05B61500; + dsi_set_cmdq(data_array, 1, 1); + +//#2dot-Inversion + data_array[0]=0x00043902; + data_array[1]=0x020202BC; + dsi_set_cmdq(data_array, 2, 1); + +//#Display option control-> video mode + data_array[0]=0x00033902; + data_array[1]=0x0000D4B1; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00063902; + data_array[1]=0x500200C9; + data_array[2]=0x00005050; + dsi_set_cmdq(data_array, 3, 1); + +//#Gate EQ for rising edge + data_array[0]=0x00033902; + data_array[1]=0x008080B7; + dsi_set_cmdq(data_array, 2, 1); + +//#Source EQ + data_array[0]=0x00053902; + data_array[1]=0x070701B8; + data_array[2]=0x00000007; + dsi_set_cmdq(data_array, 3, 1); + data_array[0]=0x00053902; + data_array[1]=0x0100002A; + data_array[2]=0x000000DF; + dsi_set_cmdq(data_array, 3, 1); + data_array[0]=0x00053902; + data_array[1]=0x0300002B; + data_array[2]=0x00000055; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00351500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0055; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(data_array, 2, 1); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(10); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, lcm_setbacklight level=%d\n", __func__,level); + MDELAY(50); +#else + printk("lcm_setbacklight level=%d\n",level); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + lcm_init(); + data_array[0]=0x00110500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0]=0x00290500; + dsi_set_cmdq(data_array, 1, 1); +} + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#if defined(BUILD_UBOOT) + #include + #define LCM_PRINT printf + #ifndef KERN_INFO + #define KERN_INFO + #endif +#else + #include + #include + #define LCM_PRINT printk +#endif + +#if 1 +#define LCM_DBG(fmt, arg...) \ + LCM_PRINT("[LCM-NT35510-DSI] %s (line:%d) :" fmt "\r\n", __func__, __LINE__, ## arg) +#else +#define LCM_DBG(fmt, arg...) do {} while (0) +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x80) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update); +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update); +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) +#ifndef GPIO_LCD_BACKLIGHT_EN_PIN +#define GPIO_LCD_BACKLIGHT_EN_PIN GPIO68 +#define GPIO_LCD_BACKLIGHT_EN_PIN_M_GPIO GPIO_MODE_GPIO +#endif + + +static void lcm_init(void); + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void config_gpio(void) +{ + LCM_DBG(); + mt_set_gpio_mode(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_LCD_BACKLIGHT_EN_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_DIR_OUT); + mt_set_gpio_pull_enable(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_PULL_DISABLE); +} + +static void light_lcd_on(int on) +{ + LCM_DBG("on=%d", on); + if ( on ){ + mt_set_gpio_out(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_OUT_ONE); + } + else{ + mt_set_gpio_out(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_OUT_ZERO); + } +} +#if 0 +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xF0, 5, {0x55, 0xaa, 0x52, 0x08, 0x01}}, + {REGFLAG_DELAY, 1, {}}, + + {0xD1, 52, {0x00, 0x00, 0x00, 0x16, + 0x00, 0x42, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x97, + 0x00, 0xAD, 0x00, 0xDE, + 0x01, 0x00, 0x01, 0x26, + 0x01, 0x50, 0x01, 0x87, + 0x01, 0xB3, 0x01, 0xB6, + 0x01, 0xDC, 0x02, 0x04, + 0x02, 0x1C, 0x02, 0x34, + 0x02, 0x4E, 0x02, 0x8A, + 0x02, 0xC2, 0x03, 0x04, + 0x03, 0x2E, 0x03, 0x74, + 0x03, 0xEB, 0x03, 0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + {0xD2, 52, {0x00, 0x00, 0x00, 0x16, + 0x00, 0x42, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x97, + 0x00, 0xAD, 0x00, 0xDE, + 0x01, 0x00, 0x01, 0x26, + 0x01, 0x50, 0x01, 0x87, + 0x01, 0xB3, 0x01, 0xB6, + 0x01, 0xDC, 0x02, 0x04, + 0x02, 0x1C, 0x02, 0x34, + 0x02, 0x4E, 0x02, 0x8A, + 0x02, 0xC2, 0x03, 0x04, + 0x03, 0x2E, 0x03, 0x74, + 0x03, 0xEB, 0x03, 0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + {0xD3, 52, {0x00, 0x00, 0x00, 0x16, + 0x00, 0x42, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x97, + 0x00, 0xAD, 0x00, 0xDE, + 0x01, 0x00, 0x01, 0x26, + 0x01, 0x50, 0x01, 0x87, + 0x01, 0xB3, 0x01, 0xB6, + 0x01, 0xDC, 0x02, 0x04, + 0x02, 0x1C, 0x02, 0x34, + 0x02, 0x4E, 0x02, 0x8A, + 0x02, 0xC2, 0x03, 0x04, + 0x03, 0x2E, 0x03, 0x74, + 0x03, 0xEB, 0x03, 0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + {0xD4, 52, {0x00, 0x00, 0x00, 0x16, + 0x00, 0x42, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x97, + 0x00, 0xAD, 0x00, 0xDE, + 0x01, 0x00, 0x01, 0x26, + 0x01, 0x50, 0x01, 0x87, + 0x01, 0xB3, 0x01, 0xB6, + 0x01, 0xDC, 0x02, 0x04, + 0x02, 0x1C, 0x02, 0x34, + 0x02, 0x4E, 0x02, 0x8A, + 0x02, 0xC2, 0x03, 0x04, + 0x03, 0x2E, 0x03, 0x74, + 0x03, 0xEB, 0x03, 0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + {0xD5, 52, {0x00, 0x00, 0x00, 0x16, + 0x00, 0x42, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x97, + 0x00, 0xAD, 0x00, 0xDE, + 0x01, 0x00, 0x01, 0x26, + 0x01, 0x50, 0x01, 0x87, + 0x01, 0xB3, 0x01, 0xB6, + 0x01, 0xDC, 0x02, 0x04, + 0x02, 0x1C, 0x02, 0x34, + 0x02, 0x4E, 0x02, 0x8A, + 0x02, 0xC2, 0x03, 0x04, + 0x03, 0x2E, 0x03, 0x74, + 0x03, 0xEB, 0x03, 0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + {0xD6, 52, {0x00, 0x00, 0x00, 0x16, + 0x00, 0x42, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x97, + 0x00, 0xAD, 0x00, 0xDE, + 0x01, 0x00, 0x01, 0x26, + 0x01, 0x50, 0x01, 0x87, + 0x01, 0xB3, 0x01, 0xB6, + 0x01, 0xDC, 0x02, 0x04, + 0x02, 0x1C, 0x02, 0x34, + 0x02, 0x4E, 0x02, 0x8A, + 0x02, 0xC2, 0x03, 0x04, + 0x03, 0x2E, 0x03, 0x74, + 0x03, 0xEB, 0x03, 0xFF}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB9, 3, {0x24, 0x24, 0x24}}, + {REGFLAG_DELAY, 1, {}}, + + {0xBA, 3, {0x24, 0x24, 0x24}}, + {REGFLAG_DELAY, 1, {}}, + + {0xBC, 3, {0x00, 0x88, 0x01}}, + {REGFLAG_DELAY, 1, {}}, + + {0xBD, 3, {0x00, 0x88, 0x01}}, + {REGFLAG_DELAY, 1, {}}, + + {0xBE, 2, {0x00, 0x78}}, + {REGFLAG_DELAY, 1, {}}, + + {0xF0, 5, {0x55, 0xAA, 0x52, 0x08, 0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0xB1, 2, {0xEF, 0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0xBC, 3, {0x05, 0x05, 0x05}}, + {REGFLAG_DELAY, 1, {}}, + + // Sleep Out + {0x11, 1, {0x00}}, + // LCM driver IC specifies 15ms needed after sleep out. But we need more delay time to make sure latest RAM data has been refreshed to screen. + {REGFLAG_DELAY, 200, {}}, + + {0x2A, 4, {0x00, 0x00, 0x01, 0xDF}}, + {REGFLAG_DELAY, 1, {}}, + + {0x2B, 4, {0x00, 0x00, 0x03, 0x55}}, + {REGFLAG_DELAY, 1, {}}, + + // Display on + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + // Display on + {0x2c, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + //#Enable Page1 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x01}}, + {REGFLAG_DELAY, 1, {}}, + //# AVDD: manual, + {0xB6, 3, {0x34,0x34,0x34}}, + {REGFLAG_DELAY, 1, {}}, + {0xB0, 3, {0x0C,0x0C,0x0C}}, + {REGFLAG_DELAY, 1, {}}, + //# AVEE: manual, \6V + {0xB7, 3, {0x24,0x24,0x24}}, + {REGFLAG_DELAY, 1, {}}, + {0xB1, 3, {0x0C,0x0C,0x0C}}, + {REGFLAG_DELAY, 1, {}}, + + //#Power Control for VCL + {0xB8, 1, {0x34}}, + {REGFLAG_DELAY, 1, {}}, + {0xB2, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + //# VGH: Clamp Enable, + {0xB9, 3, {0x24,0x24,0x24}},//{0x34,0x34,0x34} + {REGFLAG_DELAY, 1, {}}, + {0xB3, 3, {0x08,0x08,0x08}}, + {REGFLAG_DELAY, 1, {}}, + + //# VGL(LVGL): + {0xBA, 3, {0x24,0x24,0x24}},//{0x14,0x14,0x14} + {REGFLAG_DELAY, 1, {}}, + + //# VGL_REG(VGLO) + {0xB5, 3, {0x08,0x08,0x08}}, + {REGFLAG_DELAY, 1, {}}, + + //# VGMP/VGSP: + {0xBC, 3, {0x00,0x08,0x00}},//{0x00,0x80,0x00} + {REGFLAG_DELAY, 1, {}}, + + //# VGMN/VGSN + {0xBD, 3, {0x00,0x08,0x00}},//{0x00,0x80,0x00} + {REGFLAG_DELAY, 1, {}}, + + //# VCOM=\0.1 + {0xBE, 2, {0x00,0x48}},//{0x00,0x2F} + {REGFLAG_DELAY, 1, {}}, + + //#R+ + {0xD1, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#G+ + {0xD2, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#B+ + {0xD3, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#R- + {0xD4, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#G- + {0xD5, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#B- + {0xD6, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 10, {}}, + + //#Enable Page0 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + //# Color Enhance Setting + //{0xB4, 1, {0x00}},//diable + //{REGFLAG_DELAY, 3, {}}, + {0xB4, 1, {0x01}},//enable + {REGFLAG_DELAY, 1, {}}, + + //# RGB I/F Setting + {0xB0, 5, {0x00,0x05,0x02,0x05,0x02}}, + {REGFLAG_DELAY, 1, {}}, + + //## SDT: + {0xB6, 1, {0x07}},//{0x05} + {REGFLAG_DELAY, 1, {}}, + + {0xB7, 2, {0x71,0x71}},//{0x70,0x70} + {REGFLAG_DELAY, 1, {}}, + + {0xB8, 4, {0x01,0x0A,0x0A,0x0A}},//{0x01,0x05,0x05,0x05} + {REGFLAG_DELAY, 1, {}}, + + //# Inversion: Column + {0xBC, 3, {0x00,0x00,0x00}},//{0x05,0x05,0x05} + {REGFLAG_DELAY, 1, {}}, + + //# BOE's Setting (default) + {0xCC, 3, {0x03,0x50,0x50}}, + {REGFLAG_DELAY, 1, {}}, + + //# Display Timing: + {0xBD, 5, {0x01,0x84,0x07,0x31,0x00}},//{0x01,0x00,0x07,0x31,0x00} + {REGFLAG_DELAY, 1, {}}, + //{0xBE, 5, {0x01,0x84,0x07,0x31,0x00}}, + //{REGFLAG_DELAY, 3, {}}, + //{0xBF, 5, {0x01,0x84,0x07,0x31,0x00}}, + //{REGFLAG_DELAY, 3, {}}, + + {0xF0, 4, {0xAA,0x55,0x25,0x01}}, + {REGFLAG_DELAY, 1, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 1, {}}, + + {0x11, 0, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + //#Enable Page 0 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + //#VScan + + //(vodeo mode&command mode) + //{0xB1, 2, {0xF8,0x00}}, + //0512-87172138-7122, 15950021248 + //(only command mode) + {0xB1, 2, {0xE8,0x00}}, + {REGFLAG_DELAY, 1, {}}, + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +#else +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + //#Enable Page1 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x01}}, + {REGFLAG_DELAY, 1, {}}, + //# VGMP/VGMN/VOOM Setting, VGMP=4.8V #VGSP=0.6125V + {0xBC, 3, {0x00,0x78,0x1A}}, + {REGFLAG_DELAY, 1, {}}, + //# VGMN=-4.8V #VGSN=-0.6125V + {0xBD, 3, {0x00,0x78,0x1A}}, + {REGFLAG_DELAY, 1, {}}, + //#VCOM= + {0xBE, 2, {0x00,0x49}}, + {REGFLAG_DELAY, 1, {}}, + + //#R+ + {0xD1, 52, {0x00,0x00,0x00,0x13,0x00,0x27,0x00,0x46,0x00,0x6A, + 0x00,0xA4,0x00,0xD5,0x01,0x1E,0x01,0x53,0x01,0x9B, + 0x01,0xCB,0x02,0x16,0x02,0x4E,0x02,0x4F,0x02,0x7F, + 0x02,0xB3,0x02,0xCF,0x02,0xEE,0x03,0x01,0x03,0x1B, + 0x03,0x2A,0x03,0x40,0x03,0x50,0x03,0x67,0x03,0xA8, + 0x03,0xD8}}, + {REGFLAG_DELAY, 1, {}}, + //#G+ + {0xD2, 52, {0x00,0x00,0x00,0x13,0x00,0x27,0x00,0x46,0x00,0x6A, + 0x00,0xA4,0x00,0xD5,0x01,0x1E,0x01,0x53,0x01,0x9B, + 0x01,0xCB,0x02,0x16,0x02,0x4E,0x02,0x4F,0x02,0x7F, + 0x02,0xB3,0x02,0xCF,0x02,0xEE,0x03,0x01,0x03,0x1B, + 0x03,0x2A,0x03,0x40,0x03,0x50,0x03,0x67,0x03,0xA8, + 0x03,0xD8}}, + {REGFLAG_DELAY, 1, {}}, + //#B+ + {0xD3, 52, {0x00,0x00,0x00,0x13,0x00,0x27,0x00,0x46,0x00,0x6A, + 0x00,0xA4,0x00,0xD5,0x01,0x1E,0x01,0x53,0x01,0x9B, + 0x01,0xCB,0x02,0x16,0x02,0x4E,0x02,0x4F,0x02,0x7F, + 0x02,0xB3,0x02,0xCF,0x02,0xEE,0x03,0x01,0x03,0x1B, + 0x03,0x2A,0x03,0x40,0x03,0x50,0x03,0x67,0x03,0xA8, + 0x03,0xD8}}, + {REGFLAG_DELAY, 1, {}}, + //#R- + {0xD4, 52, {0x00,0x00,0x00,0x13,0x00,0x27,0x00,0x46,0x00,0x6A, + 0x00,0xA4,0x00,0xD5,0x01,0x1E,0x01,0x53,0x01,0x9B, + 0x01,0xCB,0x02,0x16,0x02,0x4E,0x02,0x4F,0x02,0x7F, + 0x02,0xB3,0x02,0xCF,0x02,0xEE,0x03,0x01,0x03,0x1B, + 0x03,0x2A,0x03,0x40,0x03,0x50,0x03,0x67,0x03,0xA8, + 0x03,0xD8}}, + {REGFLAG_DELAY, 1, {}}, + //#G- + {0xD5, 52, {0x00,0x00,0x00,0x13,0x00,0x27,0x00,0x46,0x00,0x6A, + 0x00,0xA4,0x00,0xD5,0x01,0x1E,0x01,0x53,0x01,0x9B, + 0x01,0xCB,0x02,0x16,0x02,0x4E,0x02,0x4F,0x02,0x7F, + 0x02,0xB3,0x02,0xCF,0x02,0xEE,0x03,0x01,0x03,0x1B, + 0x03,0x2A,0x03,0x40,0x03,0x50,0x03,0x67,0x03,0xA8, + 0x03,0xD8}}, + {REGFLAG_DELAY, 1, {}}, + //#B- + {0xD6, 52, {0x00,0x00,0x00,0x13,0x00,0x27,0x00,0x46,0x00,0x6A, + 0x00,0xA4,0x00,0xD5,0x01,0x1E,0x01,0x53,0x01,0x9B, + 0x01,0xCB,0x02,0x16,0x02,0x4E,0x02,0x4F,0x02,0x7F, + 0x02,0xB3,0x02,0xCF,0x02,0xEE,0x03,0x01,0x03,0x1B, + 0x03,0x2A,0x03,0x40,0x03,0x50,0x03,0x67,0x03,0xA8, + 0x03,0xD8}}, + {REGFLAG_DELAY, 10, {}}, + {0xB0, 3, {0x00,0x00,0x00}}, + {REGFLAG_DELAY, 1, {}}, + //# AVDD: manual, + {0xB6, 3, {0x36,0x36,0x36}}, + {REGFLAG_DELAY, 1, {}}, + //#Power Control for VCL + {0xB8, 3, {0x26,0x26,0x26}}, + {REGFLAG_DELAY, 1, {}}, + {0xB1, 3, {0x00,0x00,0x00}}, + {REGFLAG_DELAY, 1, {}}, + //# AVEE: manual, \6V + {0xB7, 3, {0x26,0x26,0x26}}, + {REGFLAG_DELAY, 1, {}}, + {0xB9, 3, {0x34,0x34,0x34}},//{0x34,0x34,0x34} + {REGFLAG_DELAY, 1, {}}, + //# VGL(LVGL): + {0xBA, 3, {0x16,0x16,0x16}},//{0x14,0x14,0x14} + {REGFLAG_DELAY, 1, {}}, + + //#Enable Page0 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0xB1, 1, {0xFC}}, + {REGFLAG_DELAY, 1, {}}, + + {0xB4, 1, {0x10}}, + {REGFLAG_DELAY, 1, {}}, + + //## SDT: + {0xB6, 1, {0x05}},//{0x05} + {REGFLAG_DELAY, 1, {}}, + + {0xB7, 2, {0x70,0x70}},//{0x70,0x70} + {REGFLAG_DELAY, 1, {}}, + + {0xB8, 4, {0x01,0x0A,0x0A,0x0A}},//{0x01,0x05,0x05,0x05} + {REGFLAG_DELAY, 1, {}}, + + //# VGMP/VGSP: + {0xBC, 3, {0x05,0x05,0x05}},//{0x00,0x80,0x00} + {REGFLAG_DELAY, 1, {}}, + + //# VGMN/VGSN + {0xBD, 5, {0x01,0x84,0x07,0x31,0x00}},//{0x00,0x80,0x00} + {REGFLAG_DELAY, 1, {}}, + + //# VCOM=\0.1 + {0xBE, 5, {0x01,0x84,0x07,0x31,0x00}},//{0x00,0x80,0x00} + {REGFLAG_DELAY, 1, {}}, + + //# VCOM=\0.1 + {0xBE, 5, {0x01,0x84,0x07,0x31,0x00}},//{0x00,0x80,0x00} + {REGFLAG_DELAY, 1, {}}, + +//#TE ON + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x36, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x11, 0, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + //#Enable Page 0 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0xC7, 1, {0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 1, {0x11}}, + {REGFLAG_DELAY, 10, {}}, + + {0x21, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + //#VScan + + //(vodeo mode&command mode) + //{0xB1, 2, {0xF8,0x00}}, + //0512-87172138-7122, 15950021248 + //(only command mode) +//Ivan {0xB1, 2, {0xE8,0x00}}, +//Ivan {REGFLAG_DELAY, 1, {}}, + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sw_reset_setting[] = { + // Sleep Out + {0x01, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void dsi_send_cmdq_tinno(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update) +{ + unsigned int item[16]; + unsigned char dsi_cmd = (unsigned char)cmd; + unsigned char dc; + int index = 0, length = 0; + + memset(item,0,sizeof(item)); + if(count+1 > 60) + { + LCM_DBG("Exceed 16 entry\n"); + return; + } +/* + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 +*/ + if(count == 0) + { + item[0] = 0x0500 | (dsi_cmd<<16); + length = 1; + } + else if(count == 1) + { + item[0] = 0x1500 | (dsi_cmd<<16) | (para_list[0]<<24); + length = 1; + } + else + { + item[0] = 0x3902 | ((count+1)<<16);//Count include command. + ++length; + while(1) + { + if (index == count+1) + break; + if ( 0 == index ){ + dc = cmd; + }else{ + dc = para_list[index-1]; + } + item[index/4+1] |= (dc<<(8*(index%4))); + if ( index%4 == 0 ) ++length; + ++index; + } + } + + dsi_set_cmdq(&item, length, force_update); + +} + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: +// dsi_send_cmdq_tinno(cmd, table[i].count, table[i].para_list, force_update); + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + LCM_DBG(); + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + LCM_DBG(); + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + params->dsi.LPX = 13; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; //0x07 + params->dsi.vertical_frontporch=2; //0x31 + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=0x1A;//38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0, id2 = 0; + unsigned char buffer[4]; + unsigned int array[16]; + +// push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + +//Ivan +// 00 = MTK Config = Type 0 Instruction = Short Packet read/write +// 37 = DSI Data type = Set Maximum return packet size +// 0003 = data length = 3 bytes data to read +//Data = 00/11/22/33 +// config_gpio(); +/* + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(120); + + array[0] = 0x00013700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + MDELAY(10); + + read_reg_v2(0xDB, buffer, 1); + id = buffer[0]; //we only need ID +*/ + + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(120); + buffer[0] = 0; + buffer[1] = 0; + buffer[2] = 0; + buffer[3] = 0; + + array[0]=0x00063902; + array[1]=0x52AA55F0; + array[2]=0x00000108; + dsi_set_cmdq(&array, 3, 1); + MDELAY(10); + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + MDELAY(10); + + read_reg_v2(0xC5, buffer, 2); + id = buffer[0]; //we only need ID + id2= buffer[1]; //we test buffer 1 + + LCM_DBG("ID1 = %x, ID2 = %x, ID3 = %x, ID4 = %x", buffer[0],buffer[1],buffer[2],buffer[3]); +// return (LCM_ID == id)?1:0; + return 1; +} + +static void lcm_init(void) +{ + LCM_DBG(); +// config_gpio(); +// lcm_compare_id(); + + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(150); + +// push_table(lcm_sw_reset_setting, sizeof(lcm_sw_reset_setting) / sizeof(struct LCM_setting_table), 1); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + + MDELAY(25); +} + +static void lcm_suspend(void) +{ + LCM_DBG(); + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_resume(void) +{ + LCM_DBG(); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; +//Ivan +// 02 = MTK Config = Type 2 Instruction +// 39 = DSI Data type = DCS Long write +// 0005 = data length = 5 bytes data follow +//Data = 00/11/22/33 + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); +} + +static void lcm_setbacklight(unsigned int level) +{ + LCM_DBG("level=%d", level); + + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); + + light_lcd_on( level ); +} + +static void lcm_setpwm(unsigned int divider) +{ + LCM_DBG(); + // TBD +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +/*Begin lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) +/*End lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + unsigned int div2_real=0; + unsigned int cycle_time = 0; + unsigned int ui = 0; + unsigned int hs_trail_m, hs_trail_n; + #define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + div2_real=params->dsi.pll_div2 ? params->dsi.pll_div2*0x02 : 0x1; + cycle_time = (8 * 1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)); + ui = (1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)) + 1; + + hs_trail_m=params->dsi.LANE_NUM; + hs_trail_n=NS_TO_CYCLE(((params->dsi.LANE_NUM * 4 * ui) + 60), cycle_time); + +// params->dsi.HS_TRAIL = ((hs_trail_m > hs_trail_n) ? hs_trail_m : hs_trail_n) + 3;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_TRAIL = 20; + params->dsi.HS_ZERO = NS_TO_CYCLE((115 + 6 * ui), cycle_time);//min 105ns+6*UI + params->dsi.HS_PRPR = NS_TO_CYCLE((50 + 4 * ui), cycle_time);//min 40ns+4*UI; max 85ns+6UI + // HS_PRPR can't be 1. + if (params->dsi.HS_PRPR < 2) + params->dsi.HS_PRPR = 2; + + params->dsi.LPX = NS_TO_CYCLE(200, cycle_time);//min 50ns + + params->dsi.TA_SACK = 1; + params->dsi.TA_GET = 5 * params->dsi.LPX;//5*LPX + params->dsi.TA_SURE = 3 * params->dsi.LPX / 2;//min LPX; max 2*LPX; + params->dsi.TA_GO = 4 * params->dsi.LPX;//4*LPX + + params->dsi.CLK_TRAIL = NS_TO_CYCLE(70, cycle_time);//min 60ns + // CLK_TRAIL can't be 1. + if (params->dsi.CLK_TRAIL < 2) + params->dsi.CLK_TRAIL = 2; + params->dsi.CLK_ZERO = NS_TO_CYCLE((300), cycle_time);//min 300ns-38ns + params->dsi.LPX_WAIT = 1; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = NS_TO_CYCLE((38 + 95) / 2, cycle_time);//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00B21500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x01BF1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x343434BA; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(&data_array, 1, 1); +// MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(200); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + + data_array[0] = 0x002C0500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00110500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); + + data_array[0]=0x00290500; + dsi_set_cmdq(&data_array, 1, 1); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, \n", __func__); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(&data_array, 2, 1); +} + + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +/*Begin lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) +/*End lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + unsigned int div2_real=0; + unsigned int cycle_time = 0; + unsigned int ui = 0; + unsigned int hs_trail_m, hs_trail_n; + #define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + div2_real=params->dsi.pll_div2 ? params->dsi.pll_div2*0x02 : 0x1; + cycle_time = (8 * 1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)); + ui = (1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)) + 1; + + hs_trail_m=params->dsi.LANE_NUM; + hs_trail_n=NS_TO_CYCLE(((params->dsi.LANE_NUM * 4 * ui) + 60), cycle_time); + +// params->dsi.HS_TRAIL = ((hs_trail_m > hs_trail_n) ? hs_trail_m : hs_trail_n) + 3;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_TRAIL = 20; + params->dsi.HS_ZERO = NS_TO_CYCLE((115 + 6 * ui), cycle_time);//min 105ns+6*UI + params->dsi.HS_PRPR = NS_TO_CYCLE((50 + 4 * ui), cycle_time);//min 40ns+4*UI; max 85ns+6UI + // HS_PRPR can't be 1. + if (params->dsi.HS_PRPR < 2) + params->dsi.HS_PRPR = 2; + + params->dsi.LPX = NS_TO_CYCLE(200, cycle_time);//min 50ns + + params->dsi.TA_SACK = 1; + params->dsi.TA_GET = 5 * params->dsi.LPX;//5*LPX + params->dsi.TA_SURE = 3 * params->dsi.LPX / 2;//min LPX; max 2*LPX; + params->dsi.TA_GO = 4 * params->dsi.LPX;//4*LPX + + params->dsi.CLK_TRAIL = NS_TO_CYCLE(70, cycle_time);//min 60ns + // CLK_TRAIL can't be 1. + if (params->dsi.CLK_TRAIL < 2) + params->dsi.CLK_TRAIL = 2; + params->dsi.CLK_ZERO = NS_TO_CYCLE((300), cycle_time);//min 300ns-38ns + params->dsi.LPX_WAIT = 1; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = NS_TO_CYCLE((38 + 95) / 2, cycle_time);//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00B21500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x01BF1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x343434BA; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(&data_array, 1, 1); +// MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(200); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + + data_array[0] = 0x002C0500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00110500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); + + data_array[0]=0x00290500; + dsi_set_cmdq(&data_array, 1, 1); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, \n", __func__); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(&data_array, 2, 1); +} + + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x55, 1, {0x02}}, + {REGFLAG_DELAY, 1, {}}, + + {0x53, 1, {0x2C}}, + {REGFLAG_DELAY, 1, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {REGFLAG_DELAY, 1, {}}, + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x51, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +//static struct LCM_setting_table lcm_set_window[] = { +// {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, +// {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, +// {REGFLAG_END_OF_TABLE, 0x00, {}} +//}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + // LCM driver IC specifies 15ms needed after sleep out. But we need more delay time to make sure latest RAM data has been refreshed to screen. + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +//static struct LCM_setting_table lcm_backlight_level_setting[] = { +// {0x51, 1, {0xFF}}, +// {REGFLAG_END_OF_TABLE, 0x00, {}} +//}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + // NT35565 accept maximum 510Mbps + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + // Work around for Novatek driver IC. If it entered ULP mode, it must be reset before resume. + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +//static void lcm_setbacklight(unsigned int level) +//{ + // Refresh value of backlight level. +// lcm_backlight_level_setting[0].para_list[0] = level; + +// push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +//} + + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +*/ +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_king_s9081/lcm/nt35582_mcu/nt35582_mcu.c b/cink_king_s9081/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100755 index 0000000..d1c2534 --- /dev/null +++ b/cink_king_s9081/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,394 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; //note:this para is different between 6573 and 6575 + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.read_latency = 0; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_king_s9081/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c b/cink_king_s9081/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c new file mode 100755 index 0000000..1735532 --- /dev/null +++ b/cink_king_s9081/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c @@ -0,0 +1,345 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->io_select_mode = 1; //note:this para is different between 6573 and 6575 + + + params->dbi.port = 0; //DBI port must be 0 or 1 on mt6575, should not be 2 + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 4; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_6575_lcm_drv = +{ + .name = "nt35582_mcu_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_king_s9081/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c b/cink_king_s9081/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c new file mode 100755 index 0000000..951039c --- /dev/null +++ b/cink_king_s9081/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c @@ -0,0 +1,358 @@ +#include +#if 0 +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +/* +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) +*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} + +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +}*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_div1 = 0x15; + params->dpi.mipi_pll_clk_div2 = 5; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB565; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + + params->dbi.serial.css = 2; + params->dbi.serial.csh = 2; + params->dbi.serial.rd_1st = 2; + params->dbi.serial.rd_2nd = 2; + params->dbi.serial.wr_1st = 2; + params->dbi.serial.wr_2nd = 2; + params->dbi.serial.sif_3wire = 0; + params->dbi.serial.sif_sdi = 0; + + params->dbi.serial.sif_1st_pol = 0; + params->dbi.serial.sif_sck_def = 0; + params->dbi.serial.sif_div2 = 0; + params->dbi.serial.sif_hw_cs = 1; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + params->dpi.i2x_en = 0; + params->dpi.i2x_edge = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +// config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +// config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ +// config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER nt35582_rgb_6575_lcm_drv = +{ + .name = "nt35582_rgb_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/cink_king_s9081/lcm/r61408/r61408.c b/cink_king_s9081/lcm/r61408/r61408.c new file mode 100755 index 0000000..802d242 --- /dev/null +++ b/cink_king_s9081/lcm/r61408/r61408.c @@ -0,0 +1,300 @@ +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x1408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +#if defined(LCM_DSI_CMD_MODE) + data_array[0] = 0x04B02300;//B0 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + data_array[0] = 0x00032902;//MIPI DSI Control + data_array[1] = 0x008352B6; //B6 + dsi_set_cmdq(&data_array, 2, 1); + + data_array[0] = 0x00152902;//BLC + data_array[1] = 0x090900B8; //B8 + data_array[2] = 0xe6e6ffff; + data_array[3] = 0x10101802; + data_array[4] = 0xbe875a37; + data_array[5] = 0x000000ff; + data_array[6] = 0x00000000; + dsi_set_cmdq(&data_array, 7, 1); + MDELAY(50); + + data_array[0] = 0x00052902; + data_array[1] = 0x02ff00B9; //B9 + data_array[2] = 0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + + data_array[0] = 0x00102902; // panel driving setting 2 + data_array[1] = 0x003143C1; //C1 + data_array[2] = 0x12322626; + data_array[3] = 0xA50a4a28; + data_array[4] = 0x0121580F; + dsi_set_cmdq(&data_array, 5, 1); + + data_array[0] = 0x28d62300;//D6 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00053902; + data_array[1] = 0x0100002A;//2A + data_array[2] = 0x000000DF; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(50); + + data_array[0] = 0x00053902; + data_array[1] = 0x0300002B;//2B + data_array[2] = 0x0000001f; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(50); + + data_array[0] = 0x00361500;//36 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x00351500;//36 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x773A1500;//3A + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x00110500;//11 + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(125); + + data_array[0] = 0x00290500;//29 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(125); +#endif +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + //lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ONE); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + MDELAY(500); +// clear_panel(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; +// data_array[6]= 0x002c3901; + + dsi_set_cmdq(data_array, 7, 0); + +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + data_array[0] = 0x00052902; + data_array[1] = 0x020000B9 | (level << 16); //B9 + data_array[2] = 0x00000008; + dsi_set_cmdq(data_array, 3, 1); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[5]; + unsigned int array[16]; + //NOTE:should reset LCM firstly + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + array[0] = 0x00053700;// read id return 5 byte + dsi_set_cmdq(array, 1, 1); + + array[0] = 0x04B02300;// unlock for reading ID + dsi_set_cmdq(array, 1, 1); + MDELAY(50); + + read_reg_v2(0xBF, buffer, 5); + id = (buffer[2] << 8) | buffer[3]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%x\n", __func__, id); +#endif + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER r61408_lcm_drv = +{ + .name = "r61408", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id +}; + diff --git a/cink_king_s9081/lcm/r63303_idisplay/r63303_idisplay.c b/cink_king_s9081/lcm/r63303_idisplay/r63303_idisplay.c new file mode 100755 index 0000000..492a9e0 --- /dev/null +++ b/cink_king_s9081/lcm/r63303_idisplay/r63303_idisplay.c @@ -0,0 +1,420 @@ +#include + +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (640) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB2, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB7, 4, {0x01, 0x00, 0x05, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC4, 6, {0xDF, 0x01, 0x1C, 0x0C, + 0x00, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCA, 8, {0x01, 0x80, 0x01, 0x01, + 0x7B, 0x33, 0x03, 0x03}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCB, 7, {0x00, 0x00, 0x03, 0x20, + 0x03, 0x00, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + //{0xB2, 1, {0x03}}, + //{REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 3; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active = 16; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 12; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 16; + params->dsi.horizontal_backporch = 14; + params->dsi.horizontal_frontporch = 14; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + +#define GPIO_PIN_1V8 21 +#define GPIO_PIN_5V7 19 + +extern void DSI_clk_HS_mode(bool enter); +static unsigned int is_init = false; + +static void lcm_init(void) +{ + unsigned char buffer[5]; + unsigned int data_array[16]; + + DSI_clk_HS_mode(0); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ZERO); + + mt_set_gpio_mode(GPIO_PIN_5V7, GPIO_MODE_GPIO); + mt_set_gpio_mode(GPIO_PIN_1V8, GPIO_MODE_GPIO); + SET_RESET_PIN(0); + + mt_set_gpio_dir(GPIO_PIN_5V7, GPIO_DIR_OUT); + mt_set_gpio_dir(GPIO_PIN_1V8, GPIO_DIR_OUT); + + MDELAY(100); + + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ONE); + MDELAY(100); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ONE); + MDELAY(100); + + // SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(100); + + // Enable high speed clock + DSI_clk_HS_mode(1); + MDELAY(10); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + + data_array[0] = 0x00043700; + dsi_set_cmdq(data_array, 1, 1); + read_reg_v2(0xB7, buffer, 4); + + is_init = true; + +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ZERO); + + is_init = false; +} + + +static void lcm_resume(void) +{ + if (!is_init) + lcm_init(); + + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_king_s9081/lcm/spfd5461a/spfd5461a.c b/cink_king_s9081/lcm/spfd5461a/spfd5461a.c new file mode 100755 index 0000000..9345227 --- /dev/null +++ b/cink_king_s9081/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,350 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_king_s9081/lcm/ta7601/ta7601.c b/cink_king_s9081/lcm/ta7601/ta7601.c new file mode 100755 index 0000000..9877792 --- /dev/null +++ b/cink_king_s9081/lcm/ta7601/ta7601.c @@ -0,0 +1,283 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/cink_king_s9081/lcm/tft1p3037/tft1p3037.c b/cink_king_s9081/lcm/tft1p3037/tft1p3037.c new file mode 100755 index 0000000..4a2dffd --- /dev/null +++ b/cink_king_s9081/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,314 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/bm8578/bm8578.c b/cink_peax_tinnoes77_s9091/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..a723aa4 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/bm8578/bm8578.c @@ -0,0 +1,304 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/dummy/dummy.c b/cink_peax_tinnoes77_s9091/lcm/dummy/dummy.c new file mode 100644 index 0000000..a9fb64a --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/dummy/dummy.c @@ -0,0 +1,145 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/cink_peax_tinnoes77_s9091/lcm/gn_ssd2825_smd_s6e8aa/gn_ssd2825_smd_s6e8aa.c b/cink_peax_tinnoes77_s9091/lcm/gn_ssd2825_smd_s6e8aa/gn_ssd2825_smd_s6e8aa.c new file mode 100755 index 0000000..372e126 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/gn_ssd2825_smd_s6e8aa/gn_ssd2825_smd_s6e8aa.c @@ -0,0 +1,946 @@ +#include +#include "lcm_drv.h" +//#define LCD_DEBUG +#ifdef BUILD_UBOOT +#include +#include +#ifdef LCD_DEBUG +#define LCM_DEBUG(format, ...) printf("uboot ssd2825" format "\n", ## __VA_ARGS__) +#else +#define LCM_DEBUG(format, ...) +#endif +#else +#include +#include +#ifdef LCD_DEBUG +#define LCM_DEBUG(format, ...) printk("kernel ssd2825" format "\n", ## __VA_ARGS__) +#else +#define LCM_DEBUG(format, ...) +#endif +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) //(GPIO47) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) //(GPIO51) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) //(GPIO52) +#define LSDI_GPIO_PIN (GPIO_DISP_LSA0_PIN) //(GPIO48) + +#define SSD2825_SHUT_GPIO_PIN (GPIO_SSD2825_SHUT_PIN) //(GPIO83) +#define SSD2825_POWER_GPIO_PIN (GPIO_SSD2825_POWER_PIN) //(GPIO106) +#define SSD2825_MIPI_CLK_GPIO_PIN (GPIO_SSD2825_CLK_PIN) //(GPIO70) +#define LCD_POWER_GPIO_PIN (GPIO_LCD_POWER_PIN) // (GPIO86) + +#define FRAME_WIDTH (720) +#define FRAME_HEIGHT (1280) + +#define SSD2825_ID (0x2825) + +#define GAMMABACKLIGHT_NUM 25 +#define GAMMA_TABLE_MAX_INDEX 26 //ARRAY_OF(gamma_table)-1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) +#define GET_HX_SDI mt_get_gpio_in(LSDI_GPIO_PIN) + + +#define HX_WR_COM (0x70) +#define HX_WR_REGISTER (0x72) +#define HX_RD_REGISTER (0x73) + +static void setGammaBacklight(unsigned int level); +static void setDynamicElvss(unsigned int level); +//extern int lcd_set_pwm(int pwm_num); +static void lcm_setbacklight(unsigned int level); + +static int g_last_Backlight_level = -1; +#define ARRAY_OF(x) ((int)(sizeof(x)/sizeof(x[0]))) + +int lcd_set_pwm(int pwm_num) +{ + struct pwm_spec_config pwm_setting; + + pwm_setting.pwm_no = pwm_num; + pwm_setting.mode = PWM_MODE_FIFO; //new mode fifo and periodical mode + pwm_setting.clk_div = CLK_DIV1; + pwm_setting.clk_src = PWM_CLK_NEW_MODE_BLOCK; + + + pwm_setting.PWM_MODE_FIFO_REGS.HDURATION = 1; + pwm_setting.PWM_MODE_FIFO_REGS.LDURATION = 1; + pwm_setting.PWM_MODE_FIFO_REGS.IDLE_VALUE = 0; + pwm_setting.PWM_MODE_FIFO_REGS.GUARD_VALUE = 0; + pwm_setting.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63; + pwm_setting.PWM_MODE_FIFO_REGS.GDURATION = 0; + pwm_setting.PWM_MODE_FIFO_REGS.WAVE_NUM = 0; + + //printf("[LEDS]uboot: lcd_set_pwm :duty is %d\n"); + + pwm_setting.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0xAAAAAAAA; + pwm_setting.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0xAAAAAAAA ; + pwm_set_spec_config(&pwm_setting); + + + return 0; + +} + + +#ifdef BUILD_UBOOT +static int g_resume_flag = 0; +#endif + +struct __gamma_backlight { + unsigned int backlight_level; //backlight level + unsigned char gammaValue[GAMMABACKLIGHT_NUM]; //gamma value for backlight +}; + +static struct __gamma_backlight gamma_table[] = { +{30, {0x01,0x52,0x24,0x5D,0x00,0x00,0x00,0x74,0x78,0x5F,0xA8,0xB6,0xAE,0x8A,0xA5,0x93,0xB8,0xBF,0xB3,0x00,0x58,0x00,0x39,0x00,0x62}}, +{40, {0x01,0x52,0x24,0x5D,0x00,0x00,0x08,0x7E,0x84,0x6D,0xAD,0xBE,0xB7,0x8C,0xA3,0x91,0xB7,0xC0,0xB3,0x00,0x61,0x00,0x41,0x00,0x6B}}, +{50, {0x01,0x52,0x24,0x5D,0x22,0x09,0x1C,0x83,0x8D,0x77,0xAF,0xC4,0xBC,0x8F,0xA3,0x91,0xB7,0xBC,0xB1,0x00,0x68,0x00,0x49,0x00,0x73}}, +{60, {0x01,0x52,0x24,0x5D,0x37,0x23,0x28,0x87,0x95,0x83,0xB2,0xC5,0xBD,0x90,0xA0,0x8E,0xB8,0xBE,0xB7,0x00,0x6E,0x00,0x50,0x00,0x78}}, +{70, {0x01,0x52,0x24,0x5D,0x47,0x38,0x34,0x8B,0x9B,0x8C,0xB3,0xC7,0xBD,0x93,0x9F,0x8E,0xB6,0xBD,0xB4,0x00,0x74,0x00,0x57,0x00,0x80}}, +{80, {0x01,0x52,0x24,0x5D,0x51,0x45,0x3B,0x8E,0x9F,0x94,0xB5,0xC8,0xBC,0x91,0x9D,0x8E,0xB8,0xBD,0xB2,0x00,0x79,0x00,0x5C,0x00,0x86}}, +{90, {0x01,0x52,0x24,0x5D,0x58,0x4E,0x40,0x90,0xA4,0x97,0xB6,0xC8,0xBC,0x90,0x9D,0x8F,0xB9,0xBB,0xB1,0x00,0x7D,0x00,0x61,0x00,0x8A}}, +{100,{0x01,0x52,0x24,0x5D,0x5F,0x58,0x47,0x92,0xA8,0x9C,0xB7,0xC8,0xBC,0x91,0x9B,0x8D,0xB7,0xBC,0xB2,0x00,0x83,0x00,0x66,0x00,0x90}}, +{110,{0x01,0x52,0x24,0x5D,0x65,0x5F,0x4B,0x94,0xA9,0x9F,0xB6,0xC6,0xBB,0x91,0x9C,0x8C,0xB7,0xBB,0xB3,0x00,0x87,0x00,0x6A,0x00,0x94}}, +{120,{0x01,0x52,0x24,0x5D,0x68,0x66,0x50,0x95,0xAC,0xA2,0xB8,0xC7,0xB9,0x93,0x9B,0x8D,0xB5,0xBA,0xB2,0x00,0x88,0x00,0x6F,0x00,0x99}}, +{130,{0x01,0x52,0x24,0x5D,0x6B,0x69,0x54,0x97,0xAE,0xA3,0xB7,0xC7,0xBB,0x92,0x9A,0x8B,0xB8,0xB9,0xB1,0x00,0x8D,0x00,0x73,0x00,0x9D}}, +{140,{0x01,0x52,0x24,0x5D,0x6E,0x6F,0x57,0x97,0xB1,0xA4,0xB8,0xC5,0xBA,0x92,0x9A,0x8C,0xB6,0xB9,0xB1,0x00,0x92,0x00,0x77,0x00,0xA1}}, +{150,{0x01,0x52,0x24,0x5D,0x71,0x73,0x5B,0x98,0xB1,0xA6,0xBA,0xC4,0xB7,0x90,0x9B,0x8D,0xB6,0xB8,0xB0,0x00,0x96,0x00,0x7A,0x00,0xA5}}, +{160,{0x01,0x52,0x24,0x5D,0x74,0x77,0x5F,0x98,0xB3,0xA6,0xBA,0xC4,0xB9,0x92,0x9B,0x8B,0xB4,0xB6,0xB2,0x00,0x99,0x00,0x7E,0x00,0xA7}}, +{170,{0x01,0x52,0x24,0x5D,0x76,0x7A,0x63,0x9B,0xB4,0xA7,0xB7,0xC3,0xB7,0x93,0x9A,0x8D,0xB4,0xB6,0xB0,0x00,0x9D,0x00,0x82,0x00,0xAC}}, +{180,{0x01,0x52,0x24,0x5D,0x77,0x7E,0x66,0x9B,0xB5,0xA6,0xB9,0xC3,0xB8,0x92,0x99,0x8C,0xB3,0xB7,0xAE,0x00,0xA0,0x00,0x85,0x00,0xB0}}, +{190,{0x01,0x52,0x24,0x5D,0x7A,0x81,0x69,0x9C,0xB5,0xA6,0xB9,0xC3,0xB9,0x92,0x99,0x8B,0xB3,0xB6,0xAF,0x00,0xA3,0x00,0x89,0x00,0xB3}}, +{200,{0x01,0x52,0x24,0x5D,0x7B,0x83,0x6B,0x9C,0xB5,0xA7,0xBA,0xC3,0xB9,0x91,0x98,0x8B,0xB3,0xB6,0xAD,0x00,0xA6,0x00,0x8C,0x00,0xB7}}, +{210,{0x01,0x52,0x24,0x5D,0x7D,0x87,0x6E,0x9D,0xB6,0xA7,0xB7,0xC2,0xB9,0x93,0x99,0x8B,0xB1,0xB5,0xAD,0x00,0xAA,0x00,0x8F,0x00,0xBA}}, +{220,{0x01,0x52,0x24,0x5D,0x80,0x84,0x70,0x9E,0xB6,0xA8,0xB9,0xC2,0xB7,0x92,0x98,0x8B,0xB0,0xB4,0xAD,0x00,0xAC,0x00,0x92,0x00,0xBD}}, +{230,{0x01,0x52,0x24,0x5D,0x7E,0x8A,0x72,0x9E,0xB6,0xA8,0xBA,0xC3,0xB8,0x90,0x97,0x8A,0xB1,0xB5,0xAD,0x00,0xAF,0x00,0x95,0x00,0xC0}}, +//{240,{0x01,0x52,0x24,0x5D,0x81,0x8D,0x75,0x9D,0xB5,0xA8,0xBA,0xCC,0xB7,0x92,0x97,0x8A,0xAE,0xB4,0xAD,0x00,0xB3,0x00,0x98,0x00,0xC3}}, +{250,{0x01,0x52,0x24,0x5D,0x82,0x8A,0x75,0x9E,0xB6,0xA7,0xBA,0xC2,0xB9,0x92,0x97,0x8A,0xAE,0xB3,0xAE,0x00,0xB5,0x00,0x9A,0x00,0xC4}}, +{260,{0x01,0x52,0x24,0x5D,0x84,0x91,0x79,0x9F,0xB5,0xA9,0xBA,0xC2,0xB6,0x91,0x97,0x8A,0xAF,0xB2,0xAB,0x00,0xB7,0x00,0x9E,0x00,0xC9}}, +{270,{0x01,0x52,0x24,0x5D,0x84,0x92,0x7A,0x9F,0xB6,0xA8,0xB8,0xC2,0xB8,0x8F,0x97,0x89,0xB0,0xB2,0xAB,0x00,0xBA,0x00,0xA1,0x00,0xCC}}, +{280,{0x01,0x52,0x24,0x5D,0x85,0x94,0x7C,0xA0,0xB6,0xA7,0xB9,0xC1,0xB5,0x91,0x97,0x8A,0xAE,0xB1,0xAB,0x00,0xBC,0x00,0xA3,0x00,0xCF}}, +{290,{0x01,0x52,0x24,0x5D,0x86,0x97,0x7E,0xA1,0xB5,0xA7,0xBA,0xC3,0xB7,0x90,0x96,0x8A,0xAE,0xB0,0xAB,0x00,0xBF,0x00,0xA7,0x00,0xD1}}, +{300,{0x01,0x52,0x24,0x5D,0xBA,0xCD,0xB3,0xAD,0xC0,0xB1,0xBF,0xC7,0xBC,0x90,0x97,0x8A,0xAA,0xAE,0xA5,0x00,0xC2,0x00,0xA8,0x00,0xD7}}, +}; + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_HIGH; + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(10); + + SET_LSCE_LOW; + UDELAY(10); + + + for (i = 0; i < 24; ++i) + { + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + data <<= 1; + UDELAY(10); + SET_LSCK_LOW; + UDELAY(10); + SET_LSCK_HIGH; + UDELAY(10); + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +static __inline void Write_com(unsigned int cmd) +{ + unsigned int out = ((HX_WR_COM<<16) | (cmd & 0xFFFF)); + spi_send_data(out); +} + +static __inline void Write_register(unsigned int data) +{ + unsigned int out = ((HX_WR_REGISTER<<16) |(data & 0xFFFF)); + spi_send_data(out); +} + +static __inline unsigned short Read_register(void) +{ + unsigned char i,j,front_data; + unsigned short value = 0; + + front_data=HX_RD_REGISTER; + + SET_LSCE_HIGH; + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(10); + SET_LSCE_LOW; + UDELAY(10); + + for(i=0;i<8;i++) // 8 Data + { + + if ( front_data& 0x80) + SET_LSDA_HIGH; + else + SET_LSDA_LOW; + front_data<<= 1; + UDELAY(10); + SET_LSCK_LOW; + UDELAY(10); + SET_LSCK_HIGH; + UDELAY(10); + } + MDELAY(1); + + for(j=0;j<16;j++) // 16 Data + { + + SET_LSCK_HIGH; + UDELAY(10); + SET_LSCK_LOW; + value<<= 1; + value |= GET_HX_SDI; + + UDELAY(10); + } + + SET_LSCE_HIGH; + return value; + + } + + //this function only for test for the function have bug,do not call this +void ssd2825_read_s6e8aa_reg(void) +{ + int id=0,i; + int temp=0; + + //F0 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00BC); + Write_register(0x0002); + Write_com(0x00BF); + Write_register(0x00B0); + + Write_com(0x00B7); + Write_register(0x0782); + + Write_com(0x00C4); + Write_register(0x0001); + + Write_com(0x00C1); + Write_register(0x0004); + + Write_com(0x00BC); + Write_register(0x0001); + + Write_com(0x00BF); + Write_register(0x00FA); + + + Write_com(0x00C6); + temp=Read_register(); + while(!(temp&0x1)) + { + Write_com(0x00C6); + temp=Read_register(); + } + Write_com(0x00FF); + + for(i=0;i<2;i++) + { + id=Read_register(); + LCM_DEBUG("Read_register--data%d id is: %x\n",i,id); + + } + +} +static void init_lcm_registers(void) +{ + LCM_DEBUG("[LCM************]: init_lcm_registers. \n"); + + Write_com(0x00B1); + Write_register(0x0102); + Write_com(0x00B2); + Write_register(0x040E); //VBP from 3 to 4 for solomon + Write_com(0x00B3); + Write_register(0x0D40); + Write_com(0x00B4); + Write_register(0x02D0); + Write_com(0x00B5); + Write_register(0x0500); + Write_com(0x00B6); + Write_register(0x000B); //from Non-burst(0x0007) to burst mode(0x000B) + + MDELAY(2); + Write_com(0x00DE); + Write_register(0x0003); + Write_com(0x00D6); + Write_register(0x0004); + Write_com(0x00B9); + Write_register(0x0000); + + Write_com(0x00BA); + Write_register(0x801F); + + Write_com(0x00BB); + Write_register(0x0009); + Write_com(0x00B9); + Write_register(0x0001); + Write_com(0x00B8); + Write_register(0x0000); + + //F0 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0003); + Write_com(0x00BF); + Write_register(0x5AF0); + Write_register(0x005A); + //F1 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0003); + Write_com(0x00BF); + Write_register(0x5AF1); + Write_register(0x005A); + + //0x11 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0001); + Write_com(0x00BF); + Write_register(0x0011); + MDELAY(100); + //F8 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0027); + Write_com(0x00BF); + Write_register(0x2DF8); + Write_register(0x0035); + Write_register(0x0000); + Write_register(0x0093); + Write_register(0x7D3C); + Write_register(0x2708); + Write_register(0x3f7d); + Write_register(0x0000); + Write_register(0x2000); + Write_register(0x0804); + Write_register(0x006E); + Write_register(0x0000); + Write_register(0x0802); + Write_register(0x2308); + Write_register(0xC023); + Write_register(0x08C8); + Write_register(0xC148); + Write_register(0xC100); + Write_register(0xFFFF); + Write_register(0x00C8); + + //F2 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0004); + Write_com(0x00BF); + Write_register(0x80F2); + Write_register(0x0D04); //0x0D03 HD720 VBP + + //F6 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0003); + Write_com(0x00BF); + Write_register(0x00F6); + Write_register(0x0002); + + + //B6 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x000A); + Write_com(0x00BF); + Write_register(0x0CB6); + Write_register(0x0302); + Write_register(0xFF32); + Write_register(0x4444); + Write_register(0x00C0); + + //D9 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x000F); + Write_com(0x00BF); + Write_register(0x14D9); + Write_register(0x0C40); + Write_register(0xCECB); + Write_register(0xC46E); + Write_register(0x4007); + Write_register(0xCB41); + Write_register(0x6000); + Write_register(0x0019); + + //E1 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0006); + Write_com(0x00BF); + Write_register(0x10E1); + Write_register(0x171C); + Write_register(0x1D08); + + //E2 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0007); + Write_com(0x00BF); + Write_register(0xEDE2); + Write_register(0xC307); + Write_register(0x0D13); + Write_register(0x0003); + + //E3 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0002); + Write_com(0x00BF); + Write_register(0x40E3); + + //E4 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0008); + Write_com(0x00BF); + Write_register(0x00E4); + Write_register(0x1400); + Write_register(0x0080); + Write_register(0x0000); + + //F4 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0008); + Write_com(0x00BF); + Write_register(0xCFF4); + Write_register(0x120A); + Write_register(0x1E10); + Write_register(0x0233); + + //0xF7 + /*Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00BC); + Write_register(0x0002); + Write_com(0x00BF); + Write_register(0x00F7);*/ + + setGammaBacklight(GAMMA_TABLE_MAX_INDEX); + setDynamicElvss(GAMMA_TABLE_MAX_INDEX); + + //0xF7 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0002); + Write_com(0x00BF); + Write_register(0x03F7); + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDI_GPIO_PIN, GPIO_MODE_00); + + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDI_GPIO_PIN, GPIO_DIR_IN); + + + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDI_GPIO_PIN, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(LSDI_GPIO_PIN, GPIO_PULL_UP); + + //set pwm output clk + lcm_util.set_gpio_mode(SSD2825_MIPI_CLK_GPIO_PIN, GPIO_MODE_02); + lcm_util.set_gpio_dir(SSD2825_MIPI_CLK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_pull_enable(SSD2825_MIPI_CLK_GPIO_PIN, GPIO_PULL_DISABLE); + lcd_set_pwm(PWM0); + MDELAY(10); + + //set ssd2825 shut ping high + lcm_util.set_gpio_mode(SSD2825_SHUT_GPIO_PIN, GPIO_MODE_00); + lcm_util.set_gpio_dir(SSD2825_SHUT_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_pull_enable(SSD2825_SHUT_GPIO_PIN, GPIO_PULL_DISABLE); + SET_GPIO_OUT(SSD2825_SHUT_GPIO_PIN , 1); + MDELAY(1); + + //set ssd2825 poweron + lcm_util.set_gpio_mode(SSD2825_POWER_GPIO_PIN, GPIO_MODE_00); + lcm_util.set_gpio_dir(SSD2825_POWER_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_pull_enable(SSD2825_POWER_GPIO_PIN, GPIO_PULL_DISABLE); + SET_GPIO_OUT(SSD2825_POWER_GPIO_PIN , 1); + MDELAY(1); + + //set s6e8aa poweron + lcm_util.set_gpio_mode(LCD_POWER_GPIO_PIN, GPIO_MODE_00); + lcm_util.set_gpio_dir(LCD_POWER_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_pull_enable(LCD_POWER_GPIO_PIN, GPIO_PULL_DISABLE); + SET_GPIO_OUT(LCD_POWER_GPIO_PIN , 1); + MDELAY(50); + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 46; + params->dpi.mipi_pll_clk_div2 = 5; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 2; + params->dpi.hsync_back_porch = 14; + params->dpi.hsync_front_porch = 64; + params->dpi.vsync_pulse_width = 1; + params->dpi.vsync_back_porch = 3; + params->dpi.vsync_front_porch = 13; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; + + params->dpi.i2x_en = 0; + params->dpi.i2x_edge = 1; +} + +static void lcm_init(void) +{ + //unsigned short id; + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(120); + init_lcm_registers(); +} + +static void lcm_suspend(void) +{ + +#ifdef BUILD_UBOOT + g_resume_flag=1; +#endif + Write_com(0x00b7); + Write_register(0x034B); + Write_com(0x00b8); + Write_register(0x0000); + Write_com(0x00bc); + Write_register(0x0000); + Write_com(0x0028); + MDELAY(10); + Write_com(0x0010); + MDELAY(150); + Write_com(0x00b7); + Write_register(0x0344); + Write_com(0x00b9); + Write_register(0x0000); + LCM_DEBUG("lcm_suspend\n"); + MDELAY(120); +} + +static void lcm_resume(void) +{ +#ifdef BUILD_UBOOT + if(g_resume_flag==0) + { + g_resume_flag=1; + return; + } +#endif + config_gpio(); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(120); + init_lcm_registers(); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned short id; + Write_com(0x00b0); + id=Read_register(); + LCM_DEBUG("lcm_compare_id id is: %x\n",id); + + return (SSD2825_ID == id)?1:0; + +} +static void setDynamicElvss(unsigned int index) +{ + if(index >= ARRAY_OF(gamma_table)) + { + index = ARRAY_OF(gamma_table) -1; + } + + if(gamma_table[index].backlight_level>200) + { + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0003); + Write_com(0x00BF); + Write_register(0x04B1); + Write_register(0x008B); + } + else + { + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0003); + Write_com(0x00BF); + Write_register(0x04B1); + Write_register(0x0095); + } + +} + +static void setGammaBacklight(unsigned int index) +{ + //int i; + + if(index >=ARRAY_OF(gamma_table)) + { + index = ARRAY_OF(gamma_table) -1; + } + + LCM_DEBUG("setGammaBacklight index=%d ARRAY_OF(gamma_table)=%d\n", index,ARRAY_OF(gamma_table)); + //FA + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x001A); + Write_com(0x00BF); + Write_register((gamma_table[index].gammaValue[0]<<8)|0xFA); + Write_register((gamma_table[index].gammaValue[2]<<8)|(gamma_table[index].gammaValue[1])); + Write_register((gamma_table[index].gammaValue[4]<<8)|(gamma_table[index].gammaValue[3])); + Write_register((gamma_table[index].gammaValue[6]<<8)|(gamma_table[index].gammaValue[5])); + Write_register((gamma_table[index].gammaValue[8]<<8)|(gamma_table[index].gammaValue[7])); + Write_register((gamma_table[index].gammaValue[10]<<8)|(gamma_table[index].gammaValue[9])); + Write_register((gamma_table[index].gammaValue[12]<<8)|(gamma_table[index].gammaValue[11])); + Write_register((gamma_table[index].gammaValue[14]<<8)|(gamma_table[index].gammaValue[13])); + Write_register((gamma_table[index].gammaValue[16]<<8)|(gamma_table[index].gammaValue[15])); + Write_register((gamma_table[index].gammaValue[18]<<8)|(gamma_table[index].gammaValue[17])); + Write_register((gamma_table[index].gammaValue[20]<<8)|(gamma_table[index].gammaValue[19])); + Write_register((gamma_table[index].gammaValue[22]<<8)|(gamma_table[index].gammaValue[21])); + Write_register((gamma_table[index].gammaValue[24]<<8)|(gamma_table[index].gammaValue[23])); +} +static void lcm_setbacklight(unsigned int level) //back_light setting +{ + + int index,div; + div = 245*10/(ARRAY_OF(gamma_table)+1); + index = level*10/div-2; + if(index>=ARRAY_OF(gamma_table)) + { + index = ARRAY_OF(gamma_table) -1; + } + else if(index<0) + { + index = 0; + } + if(g_last_Backlight_level == index) + { + return; + } + g_last_Backlight_level = index; + if(level == 0) + { + + Write_com(0x00B7); + Write_register(0x034b); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0001); + Write_com(0x00BF); + Write_register(0x0028);//display off + + } + else + { + //0xF7 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0002); + Write_com(0x00BF); + Write_register(0x00F7); + + setGammaBacklight(index); + setDynamicElvss(index); + + //0xF7 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0002); + Write_com(0x00BF); + Write_register(0x03F7); + + MDELAY(120); + //0x29 display on + Write_com(0x00B7); + Write_register(0x034b); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0001); + Write_com(0x00BF); + Write_register(0x0029); + + } + LCM_DEBUG("lcd-backlight level=%d, index=%d\n", level,index); +} + + +#ifndef BUILD_UBOOT + +#ifdef GN_MTK_BSP_LCM_DEBUG //add by chenqiang for lcd_debug +int lcd_f9_register_write(const char * buf) +{ + int n_idx; + int max_nu=0; + int max_np=0; + int max_no=0; + int num_n=0; + int num_q=0; + const char *p = buf ; + char qq[2]; + char num[25]; + while( (*p++ != '{' )&&( max_nu++ <= 200)); + { + if(max_nu>200) + return -1; + } + for(num_n=0;num_n<=24;num_n++) + { + for(num_q=0;num_q<=1;num_q++) + { + max_np=0; + while( (*(p) == 32)&&(max_np++ <= 20) ) + { + p++; + if(max_np>20) + return -1; + } + if( (*p>='0') && (*p <='9')) + qq[num_q]=(*p++ -'0'); + else if( (*p>='A') && (*p <='F')) + qq[num_q]=(*p++ -'A' + 10); + else if( (*p>='a') && (*p <='f')) + qq[num_q]=(*p++ -'a' + 10); + else + return -1; + } + num[num_n]=qq[0]*16 + qq[1]; + } + while( (*p++!= '}' )&&( max_no++ <= 20)); + { + if(max_no>20) + return -1; + } + for(num_n =0;num_n<=24;num_n++) + { + LCM_DEBUG("register lcd_f9_register_write num[%d]=%d\n", num_n,num[num_n]); + } + //0xF7 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0002); + Write_com(0x00BF); + Write_register(0x00F7); + + //FA + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x001A); + Write_com(0x00BF); + Write_register((num[0]<<8)|0xFA); + Write_register((num[2]<<8)|(num[1])); + Write_register((num[4]<<8)|(num[3])); + Write_register((num[6]<<8)|(num[5])); + Write_register((num[8]<<8)|(num[7])); + Write_register((num[10]<<8)|(num[9])); + Write_register((num[12]<<8)|(num[11])); + Write_register((num[14]<<8)|(num[13])); + Write_register((num[16]<<8)|(num[15])); + Write_register((num[18]<<8)|(num[17])); + Write_register((num[20]<<8)|(num[19])); + Write_register((num[22]<<8)|(num[21])); + Write_register((num[24]<<8)|(num[23])); + + //0xF7 + Write_com(0x00B7); + Write_register(0x034B); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0002); + Write_com(0x00BF); + Write_register(0x03F7); + + MDELAY(120); + //0x29 display on + Write_com(0x00B7); + Write_register(0x034b); + Write_com(0x00B8); + Write_register(0x0000); + Write_com(0x00BC); + Write_register(0x0001); + Write_com(0x00BF); + Write_register(0x0029); + return 0; +} +#endif +#endif + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER gn_ssd2825_smd_s6e8aa = +{ + .name = "gn_ssd2825_smd_s6e8aa", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id, + .set_backlight = lcm_setbacklight, + +}; + diff --git a/cink_peax_tinnoes77_s9091/lcm/ha5266/ha5266.c b/cink_peax_tinnoes77_s9091/lcm/ha5266/ha5266.c new file mode 100644 index 0000000..a0f548a --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/ha5266/ha5266.c @@ -0,0 +1,333 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ +/* send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00);*/ +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 7; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 30; + params->dpi.hsync_back_porch = 16; + params->dpi.hsync_front_porch = 210; + params->dpi.vsync_pulse_width = 13; + params->dpi.vsync_back_porch = 10; + params->dpi.vsync_front_porch = 22; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA;; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + // init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +/* send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20);*/ +} + + +static void lcm_resume(void) +{ +/* send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900);*/ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ha5266_lcm_drv = +{ + .name = "ha5266", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/hsd070idw1/hsd070idw1.c b/cink_peax_tinnoes77_s9091/lcm/hsd070idw1/hsd070idw1.c new file mode 100644 index 0000000..7e527fd --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/hsd070idw1/hsd070idw1.c @@ -0,0 +1,153 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 36; + params->dpi.mipi_pll_clk_div2 = 8; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 48; + params->dpi.hsync_back_porch = 40; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 29; + params->dpi.vsync_front_porch = 13; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + lcm_util.set_gpio_dir(GPIO138, GPIO_DIR_OUT); + lcm_util.set_gpio_mode(GPIO138, GPIO_MODE_01); + //program reset pin + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +} + + +static void lcm_suspend(void) +{ +//disable output pixel clk +} + + +static void lcm_resume(void) +{ +//enable output pixel clk +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hsd070idw1_lcm_drv = +{ + .name = "hsd070idw1", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/hx8357B/hx8357b.c b/cink_peax_tinnoes77_s9091/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..f33e7fd --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/hx8357B/hx8357b.c @@ -0,0 +1,317 @@ +/***************************************************************************** + * Copyright Statement: + * -------------------- + * This software is protected by Copyright and the information contained + * herein is confidential. The software may not be copied and the information + * contained herein may not be used or disclosed except with the written + * permission of MediaTek Inc. (C) 2008 + * + * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO + * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S + * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. + * + * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE + * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE + * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF + * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND + * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER + * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). + * + *****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c b/cink_peax_tinnoes77_s9091/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c new file mode 100644 index 0000000..c0b9890 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c @@ -0,0 +1,456 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, +#else//new 20120224 +{0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x0E, 0x0E, 0x21, + 0x29, 0x3F, 0x3F, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 7, {0x02, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x1C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBF, 1, {0x05, 0x60, 0x00, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xE2, 1, {0x01}},//0x01=dynamic,0x00=static + {REGFLAG_DELAY, 10, {}}, + + {0xE5, 1, {0x15}},//0x15 L, 0x16 M, 0x17 H + {REGFLAG_DELAY, 10, {}}, +#endif + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + // SET GAMMA + #if 0 + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x85, 0x89, 0xCC, 0xD1, + 0xD6, 0x15, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x85, 0x89, 0xCC, + 0xD1, 0xD6, 0x15, 0x15, + 0x12, 0x18}}, +#else//new 20120224 +{0xE0, 34, {0x00, 0x06, 0x0A, 0x12, + 0x15, 0x3B, 0x1D, 0x34, + 0x87, 0x8E, 0xCC, 0xCF, + 0xCE, 0x0E, 0x12, 0x11, + 0x18, 0x00, 0x06, 0x0A, + 0x12, 0x15, 0x3B, 0x1D, + 0x34, 0x87, 0x8E, 0xCC, + 0xCF, 0xCE, 0x0E, 0x12, + 0x11, 0x18}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x14}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x00,0X03}},//17.143kHz + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +/* +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +*/ + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_mode_setting[] = { + {0x55, 1, {0x1}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setbacklight_mode(unsigned int mode) +{ + lcm_backlight_mode_setting[0].para_list[0] = mode; + push_table(lcm_backlight_mode_setting, sizeof(lcm_backlight_mode_setting) / sizeof(struct LCM_setting_table), 1); +} + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x63}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x09}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x11, 0x11, 0x2F, + 0x37, 0x27, 0x27, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, +#else//new 20120224 +{0xB1, 19, {0x01, 0x00, 0x44, 0x07, + 0x01, 0x0E, 0x0E, 0x21, + 0x29, 0x3F, 0x3F, 0x40, + 0x32, 0x00, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 2, {0x08, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 7, {0x02, 0x19, 0x9C, 0x08, + 0x19, 0x05, 0x73}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB6, 1, {0x1C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBF, 1, {0x05, 0x60, 0x00, 0x10}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0 + {0xE2, 1, {0x01}},//0x01=dynamic,0x00=static + {REGFLAG_DELAY, 10, {}}, + + {0xE5, 1, {0x15}},//0x15 L, 0x16 M, 0x17 H + {REGFLAG_DELAY, 10, {}}, +#endif + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + // SET GAMMA + #if 0 + {0xE0, 34, {0x00, 0x0A, 0x0F, 0x2F, + 0x32, 0x3F, 0x22, 0x42, + 0x85, 0x89, 0xCC, 0xD1, + 0xD6, 0x15, 0x15, 0x12, + 0x18, 0x00, 0x0A, 0x0F, + 0x2F, 0x32, 0x3F, 0x22, + 0x42, 0x85, 0x89, 0xCC, + 0xD1, 0xD6, 0x15, 0x15, + 0x12, 0x18}}, +#else//new 20120224 +{0xE0, 34, {0x00, 0x06, 0x0A, 0x12, + 0x15, 0x3B, 0x1D, 0x34, + 0x87, 0x8E, 0xCC, 0xCF, + 0xCE, 0x0E, 0x12, 0x11, + 0x18, 0x00, 0x06, 0x0A, + 0x12, 0x15, 0x3B, 0x1D, + 0x34, 0x87, 0x8E, 0xCC, + 0xCF, 0xCE, 0x0E, 0x12, + 0x11, 0x18}}, + +#endif + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 14, {0x11, 0x00, 0x56, 0xC6, + 0x10, 0x89, 0xFF, 0x0F, + 0x33, 0x6E, 0x04, 0x07, + 0x9A, 0x14}}, + + {0xC2, 1, {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 10, {}}, + + {0x36, 1, {0x0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC9, 2, {0x00,0X03}},//17.143kHz + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +/* +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +*/ + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_mode_setting[] = { + {0x55, 1, {0x1}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 0; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_setbacklight_mode(unsigned int mode) +{ + lcm_backlight_mode_setting[0].para_list[0] = mode; + push_table(lcm_backlight_mode_setting, sizeof(lcm_backlight_mode_setting) / sizeof(struct LCM_setting_table), 1); +} + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0xff);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x02);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 1; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +} + + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + sw_clear_panel(0); + send_ctrl_cmd(0x10); + MDELAY(5); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +static void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + send_ctrl_cmd(0xC3); + send_data_cmd(0xFF); + + send_ctrl_cmd(0xF4); + read_data_cmd(); + return (LCM_ID == read_data_cmd())?1:0; +} + +LCM_DRIVER hx8369_6575_lcm_drv = +{ + .name = "hx8369_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id, +}; + + diff --git a/cink_peax_tinnoes77_s9091/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c b/cink_peax_tinnoes77_s9091/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c new file mode 100644 index 0000000..1ac6947 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c @@ -0,0 +1,512 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, ///apply it as ESD indication + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + +static unsigned int lcm_esd_check(void) +{ +#ifndef BUILD_UBOOT + if(lcm_esd_test) + { + lcm_esd_test = FALSE; + return TRUE; + } + + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. + /* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); + */ + + if(read_reg(0xB6) == 0x42) + { + return FALSE; + } + else + { + return TRUE; + } +#endif +} + +static unsigned int lcm_esd_recover(void) +{ + unsigned char para = 0; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(120); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[2]; + unsigned int array[16]; + SET_RESET_PIN(1); //NOTE:should reset LCM firstly + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_compare_id_setting, sizeof(lcm_compare_id_setting) / sizeof(struct LCM_setting_table), 1); + + array[0] = 0x00023700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); +// id = read_reg(0xF4); + read_reg_v2(0xF4, buffer, 2); + id = buffer[0]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER hx8369_dsi_6575_lcm_drv = +{ + .name = "hx8369_dsi_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, + .set_backlight = lcm_setbacklight, +// .set_pwm = lcm_setpwm, +// .get_pwm = lcm_getpwm, + .esd_check = lcm_esd_check, + .esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +#endif +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c b/cink_peax_tinnoes77_s9091/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c new file mode 100644 index 0000000..e6b0110 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c @@ -0,0 +1,427 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include ///for printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include ///for printk +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {0x35, 1, {0x00}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0x53, 1, {0x24}}, + {REGFLAG_DELAY, 10, {}}, + + {0x55, 1, {0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0x5E, 1, {0x70}}, + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB4, 5, {0x00, 0x18, 0x80, 0x06, + 0x02}}, + {REGFLAG_DELAY, 5, {}}, + + {0xD5, 26, {0x00, 0x04, 0x03, 0x00, + 0x01, 0x05, 0x28, 0x70, + 0x01, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x51, 0x07, + 0x00, 0x00, 0x41, 0x06, + 0x50, 0x07, 0x07, 0x0F, + 0x04, 0x00}}, + {REGFLAG_DELAY, 5, {}}, + + {0xB1, 19, {0x85, 0x00, 0x34, 0x07, + 0x00, 0x0f, 0x0f, 0x2A, + 0x32, 0x3F, 0x3F, 0x01, + 0x3A, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 5, {}}, + + + {0x3A, 1, {0x07}}, + {0xCC, 1, {0x02}}, + + {0xB6, 2, {0x42, 0x42}}, + {REGFLAG_DELAY, 5, {}}, + + // SET GAMMA + {0xE0, 34, {0x00, 0x31, 0x19, 0x38, + 0x3D, 0x3F, 0x28, 0x46, + 0x07, 0x0D, 0x0E, 0x12, + 0x15, 0x12, 0x14, 0x0F, + 0x17, 0x00, 0x13, 0x19, + 0x38, 0x3D, 0x3F, 0x28, + 0x46, 0x07, 0x0D, 0x0E, + 0x12, 0x15, 0x12, 0x14, + 0x0F, 0x17}}, + {REGFLAG_DELAY, 5, {}}, + + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x02, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active = 3; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +/* // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING;*/ +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +static void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +static unsigned int lcm_esd_test = FALSE; ///only for ESD test +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static int lcm_debug_mask = 1; +#ifdef BUILD_UBOOT +#define lcm_debug(format,...) \ + do { \ + if (lcm_debug_mask) \ + printf(format,__VA_ARGS__); \ + } while (0) +#else +#define lcm_debug(format,...) \ + do { \ + if (lcm_debug_mask) \ + printk(format,__VA_ARGS__); \ + } while (0) +#endif + +struct LCM_setting_table { + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + //SET password + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB0, 2, {0x01, 0x0B}}, + + //SET Display 480x800 + {0xB2, 15, {0x00, 0x20, 0x05, 0x05, + 0x70, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x01}}, + {REGFLAG_DELAY, 10, {}}, + + + // SET Display Column Inversion + //{0xB4, 5, {0x00, 0x1D, 0x5F, 0x0E, 0x06}}, + // SET Display 2 dot Inversion + {0xB4, 5, {0x02, 0x1D, 0x5F, 0x0E, 0x06}}, + {REGFLAG_DELAY, 10, {}}, + + {0xD5, 26, {0x00, 0x05, 0x03, 0x00, + 0x01, 0x09, 0x10, 0x80, + 0x37, 0x37, 0x20, 0x31, + 0x46, 0x8A, 0x57, 0x9B, + 0x20, 0x31, 0x46, 0x8A, + 0x57, 0x9B, 0x07, 0x0F, + 0x02, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + //Set Power + {0xB1, 19, {0x01, 0x00, 0x34, 0x06, + 0x00, 0x0e, 0x0e, 0x1A, + 0x21, 0x3F, 0x3F, 0x07, + 0x23, 0x01, 0xE6, 0xE6, + 0xE6, 0xE6, 0xE6}}, + {REGFLAG_DELAY, 10, {}}, + + // SET VCOM + {0xB6, 2, {0x23, 0x23}}, + {REGFLAG_DELAY, 10, {}}, + + + + // SET GAMMA + {0xE0, 34, {0x00, 0x01, 0x03, 0x2b, + 0x33, 0x3F, 0x0D, 0x30, + 0x06, 0x0B, 0x0D, 0x10, + 0x13, 0x11, 0x13, 0x11, + 0x17, 0x00, 0x01, 0x03, + 0x2B, 0x33, 0x3F, 0x0D, + 0x30, 0x06, 0x0B, 0x0D, + 0x10, 0x13, 0x11, 0x13, + 0x11, 0x17}}, + {REGFLAG_DELAY, 10, {}}, + + //set DGC +#if 0 + {0xC1, 127, {0x01, 0x02, 0x08, 0x12, + 0x1A, 0x22, 0x2A, 0x31, + 0x36, 0x3F, 0x48, 0x51, + 0x58, 0x60, 0x68, 0x70, + 0x78, 0x80, 0x88, 0x90, + 0x98, 0xA0, 0xA7, 0xAF, + 0xB6, 0xBE, 0xC7, 0xCE, + 0xD6, 0xDE, 0xE6, 0xEF, + 0xF5, 0xFB, 0xFC, 0xFE, + 0x8C, 0xA4, 0x19, 0xEC, + 0x1B, 0x4C, 0x40, 0x02, + 0x08, 0x12, 0x1A, 0x22, + 0x2A, 0x31, 0x36, 0x3F, + 0x48, 0x51, 0x58, 0x60, + 0x68, 0x70, 0x78, 0x80, + 0x88, 0x90, 0x98, 0xA0, + 0xA7, 0xAF, 0xB6, 0xBE, + 0xC7, 0xCE, 0xD6, 0xDE, + 0xE6, 0xEF, 0xF5, 0xFB, + 0xFC, 0xFE, 0x8C, 0xA4, + 0x19, 0xEC, 0x1B, 0x4C, + 0x40, 0x02, 0x08, 0x12, + 0x1A, 0x22, 0x2A, 0x31, + 0x36, 0x3F, 0x48, 0x51, + 0x58, 0x60, 0x68, 0x70, + 0x78, 0x80, 0x88, 0x90, + 0x98, 0xA0, 0xA7, 0xAF, + 0xB6, 0xBE, 0xC7, 0xCE, + 0xD6, 0xDE, 0xE6, 0xEF, + 0xF5, 0xFB, 0xFC, 0xFE, + 0x8C, 0xA4, 0x19, 0xEC, + 0x1B, 0x4C, 0x40}}, + {REGFLAG_DELAY, 10, {}}, +#endif + + //Set MIPI + {0xBA, 13, {0x00, 0xA0, 0xC6, 0x00, + 0x0A, 0x00, 0x10, 0x30, + 0x6F, 0x02, 0x11, 0x18, + 0x40}}, + {0x35, 1, {0x00}},//TE ON + + //{0x36, 1, {0x00}},//set address mode + + {0x44, 2, {0x00,0x00}},//tear position + + {0x3A, 1, {0x77}}, + + {0x2A, 4, {0x00, 0x00, 0xDF, 0x01}}, + + {0x2B, 4, {0x00, 0x00, 0x1F, 0x03}}, + + {0x2C, 1, {0x00}}, + + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 100, {}}, + + {0x2C, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +#if 0 +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +#endif + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xB9, 3, {0xFF, 0x83, 0x69}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On +// {0xC3, 1, {0xFF}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + lcm_debug("%s: --Liu\n", __func__); + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=3; + params->dsi.vertical_backporch=12; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2048; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=146; + params->dsi.horizontal_frontporch_byte=146; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=140; + params->dsi.horizontal_frontporch_word_count=140; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + +static void lcm_init(void) +{ + lcm_debug("%s: --Liu\n", __func__); + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + lcm_debug("%s: --Liu\n", __func__); + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + lcm_debug("%s: --Liu\n", __func__); + lcm_init(); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + //lcm_debug("%s: --Liu\n", __func__); + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + +#define BACKLIGHT_ENABLE_PIN GPIO68 +static int lcm_backlight_power(int on) +{ + if(on) { + mt_set_gpio_mode(BACKLIGHT_ENABLE_PIN, GPIO_MODE_GPIO); + mt_set_gpio_dir(BACKLIGHT_ENABLE_PIN, GPIO_DIR_OUT); + #ifdef BUILD_UBOOT + mt_set_gpio_out(BACKLIGHT_ENABLE_PIN, 1); + #endif + } + else { + mt_set_gpio_mode(BACKLIGHT_ENABLE_PIN, GPIO_MODE_GPIO); + mt_set_gpio_dir(BACKLIGHT_ENABLE_PIN, GPIO_DIR_OUT); + #ifdef BUILD_UBOOT + mt_set_gpio_out(BACKLIGHT_ENABLE_PIN, 0); + #endif + } + return 0; +} +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_power(level); + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XAA +#define REGFLAG_END_OF_TABLE 0xAB // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[128]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB9, 3, {0xFF, 0x83, 0x69}}, + + {0xB1, 10, {0x12, 0x83, 0x77, 0x00, + 0x8F, 0x0F, 0x1A, 0x1A, + 0x0C, 0x0A}}, + + {0xB2, 3, {0x00, 0x10, 0x02}}, + + {0xB3, 4, {0x83, 0x00, 0x31, 0x03}}, + + {0xB4, 1, {0x42}}, + + {0xB6, 2, {0x7F, 0x7F}}, + + {0xE3, 4, {0x01, 0x01, 0x01, 0x01}}, + + {0xC0, 6, {0x73, 0x50, 0x00, 0x3C, + 0xC4, 0x00}}, + + {0xCC, 1, {0x00}}, + +#if 1 + {0xD5, 92, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#else + {0xD5, 59, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00}}, + + {0xFD, 34, { + 0xAA, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#endif + +#if 0 + {0xD5, 56, {0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x12, + 0x30, 0x00, 0x00, 0x00, + 0x01, 0x70, 0x33, 0x00, + 0x00, 0x12, 0x20, 0x60, + 0x37, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x88, + 0x88, 0x55, 0x77, 0x11, + 0x33, 0x32, 0x00, 0x00}}, + + {0xFD, 38, {0xAA, 0xAA, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x88, + 0x88, 0x88, 0x88, 0x44, + 0x66, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, + 0xAA, 0xFF, 0xFF, 0xFF, + 0x03, 0xAA, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x5A}}, +#endif + + {0xE0, 35, {0x00, 0x0C, 0x00, 0x10, + 0x14, 0x3C, 0x27, 0x34, + 0x0C, 0x10, 0x11, 0x15, + 0x18, 0x16, 0x16, 0x13, + 0x18, 0x0C, 0x00, 0x0C, + 0x10, 0x14, 0x3C, 0x27, + 0x34, 0x0C, 0x10, 0x11, + 0x15, 0x18, 0x16, 0x16, + 0x13, 0x18, 0x01}}, + + {0xEA, 1, {0x62}}, + + {0x3A, 1, {0x77}}, + + {0xBA, 15, {0x11, 0x00, 0x16, 0xC6, + 0x00, 0x0A, 0x00, 0x10, + 0x24, 0x02, 0x21, 0x21, + 0x9A, 0x17, 0x1D}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 150, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i, j, k; + unsigned int para_int, read_int; + unsigned char buffer[256]; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); +#if 0 + do { + read_int = read_reg(cmd); + para_int = *((unsigned int *)table[i].para_list); + printf("%s, compare = {%04x, %04x} \n", __func__, read_int, para_int); + } while(read_int != para_int); +#endif + } + } + +#if 0//defined(BUILD_UBOOT) + int remain_bytes; + int r_byte_count; + unsigned int array[16]; + + for(i = 0; i < count; i++) { + if(table[i].cmd != REGFLAG_DELAY && table[i].cmd != REGFLAG_END_OF_TABLE) + { + remain_bytes = table[i].count; + j = 0; + + do { + //printf("Read 0x%02x round %d. Remain %d bytes \n", table[i].cmd, j, remain_bytes); + r_byte_count = (remain_bytes > 8) ? 8 : remain_bytes; + + array[0] = 0x00003700 | (r_byte_count<<16);// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + + if(j>0) + read_reg_v2(0xFD, (buffer + j*8), r_byte_count); + else + read_reg_v2(table[i].cmd, buffer, r_byte_count); + + j++; + remain_bytes-=8; + } while(remain_bytes>0); + + printf("0x%02X[%02d] => { ", table[i].cmd, table[i].count); + for(k = 0; k < table[i].count; k++) + { + if((k % 4 ) == 0 && k > 0) + printf("\n ", buffer[k]); + printf("0x%02X ", buffer[k]); + } + printf("} \n"); + + } + } +#endif + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; +#if 0 + params->dsi.vertical_sync_active = 10; + params->dsi.vertical_backporch = 10; + params->dsi.vertical_frontporch = 10; // 2 + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 50; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; +#else + params->dsi.vertical_sync_active = 4; + params->dsi.vertical_backporch = 17; + params->dsi.vertical_frontporch = 17; // 2 + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 17; + params->dsi.horizontal_backporch = 49; + params->dsi.horizontal_frontporch = 57; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; +#endif + // Bit rate calculation + params->dsi.pll_div1=28; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + + +static void lcm_init(void) +{ + unsigned char buffer[10]; + unsigned int array[16]; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); +} + + +static void lcm_resume(void) +{ + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +#ifdef BUILD_UBOOT +// +#else +#include //for printk +#endif + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#define LCM_ID_HX8389B 0x89 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + //must use 0x39 for init setting for all register. + + {0XB9, 3, {0XFF,0X83,0X89}}, + {REGFLAG_DELAY, 10, {}}, + +#if 0//CLOSE IC ESD Protect enhance + {0XBA, 17, {0X41,0X83,0X00,0X16, + 0XA4,0X00,0X18,0XFF, + 0X0F,0X21,0X03,0X21, + 0X23,0X25,0X20,0X02, + 0X31}}, + {REGFLAG_DELAY, 10, {}}, +#else //open IC ESD Protect enhance +{0XBA, 17, {0X41,0X83,0X00,0X16, + 0XA4,0X00,0X18,0XFF, + 0X0F,0X21,0X03,0X21, + 0X23,0X25,0X20,0X02, + 0X35}}, +{REGFLAG_DELAY, 10, {}}, + +#endif + + {0XDE, 2, {0X05,0X58}}, + {REGFLAG_DELAY, 10, {}}, + + {0XB1, 19, {0X00,0X00,0X04,0XD9, + 0XCF,0X10,0X11,0XAC, + 0X0C,0X1D,0X25,0X1D, + 0X1D,0X42,0X01,0X58, + 0XF7,0X20,0X80}}, + {REGFLAG_DELAY, 10, {}}, + + + {0XB2, 5, {0X00,0X00,0X78,0X03, + 0X02}}, + {REGFLAG_DELAY, 10, {}}, + + {0XB4, 31, {0X82,0X04,0X00,0X32, + 0X10,0X00,0X32,0X10, + 0X00,0X00,0X00,0X00, + 0X17,0X0A,0X40,0X01, + 0X13,0X0A,0X40,0X14, + 0X46,0X50,0X0A,0X0A, + 0X3C,0X0A,0X3C,0X14, + 0X46,0X50,0X0A}}, + {REGFLAG_DELAY, 10, {}}, + + {0XD5, 48, {0X00,0X00,0X00,0X00, + 0X01,0X00,0X00,0X00, + 0X20,0X00,0X99,0X88, + 0X88,0X88,0X88,0X88, + 0X88,0X88,0X88,0X01, + 0X88,0X23,0X01,0X88, + 0X88,0X88,0X88,0X88, + 0X88,0X88,0X99,0X88, + 0X88,0X88,0X88,0X88, + 0X88,0X88,0X32,0X88, + 0X10,0X10,0X88,0X88, + 0X88,0X88,0X88,0X88}}, + {REGFLAG_DELAY, 10, {}}, + + + {0XB6, 4, {0X00,0X8A,0X00,0X8A}}, + {REGFLAG_DELAY, 10, {}}, + + {0XCC, 1, {0X02}}, + {REGFLAG_DELAY, 10, {}}, + + + {0X35, 1, {0X00}},//TE on + {REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 0, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_in_setting[] = { + // Display off sequence + {0x28, 0, {0x00}}, + + // Sleep Mode On + {0x10, 0, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.vertical_sync_active = 5; + params->dsi.vertical_backporch = 5; + params->dsi.vertical_frontporch = 5; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 20; + params->dsi.horizontal_backporch = 46; + params->dsi.horizontal_frontporch = 21; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10);//Must over 6 ms,SPEC request + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + + push_table(lcm_sleep_in_setting, sizeof(lcm_sleep_in_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_resume(void) +{ + + lcm_init(); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static unsigned int lcm_compare_id(void) +{ + unsigned int id=0; + unsigned char buffer[2]; + unsigned int array[16]; + + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10);//Must over 6 ms + + array[0]=0x00043902; + array[1]=0x8983FFB9;// page enable + dsi_set_cmdq(&array, 2, 1); + MDELAY(10); + + array[0] = 0x00023700;// return byte number + dsi_set_cmdq(&array, 1, 1); + MDELAY(10); + + read_reg_v2(0xF4, buffer, 2); + id = buffer[0]; + +#if defined(BUILD_UBOOT) + printf("%s, id = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID_HX8389B == id)?1:0; + +} + + + + +LCM_DRIVER hx8389b_qhd_dsi_vdo_lcm_drv = +{ + .name = "hx8389b_qhd_dsi_vdo", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .compare_id = lcm_compare_id, +#if (LCM_DSI_CMD_MODE) + .set_backlight = lcm_setbacklight, + .update = lcm_update, +#endif +}; + diff --git a/cink_peax_tinnoes77_s9091/lcm/ili9481/ili9481.c b/cink_peax_tinnoes77_s9091/lcm/ili9481/ili9481.c new file mode 100644 index 0000000..3071eb6 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/ili9481/ili9481.c @@ -0,0 +1,271 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // AUO 3.17" + ILI9481 + + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); + send_data_cmd(0X0007); + send_data_cmd(0X0041); + send_data_cmd(0X001B); + + send_ctrl_cmd(0X00D1); + send_data_cmd(0X0000); + send_data_cmd(0X0016); // 0x001b + send_data_cmd(0X0012); + + send_ctrl_cmd(0X00D2); + send_data_cmd(0X0001); + send_data_cmd(0X0011); + + send_ctrl_cmd(0X00C0); + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X00F3); + send_data_cmd(0X0040); + send_data_cmd(0X000A); + send_ctrl_cmd(0X00F6); + send_data_cmd(0X0080); + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0080); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x29); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/inc/lcm_drv.h b/cink_peax_tinnoes77_s9091/lcm/inc/lcm_drv.h new file mode 100755 index 0000000..68dacbb --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/inc/lcm_drv.h @@ -0,0 +1,559 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), + LCM_DRIVING_CURRENT_6575_4MA = (1 << 4), + LCM_DRIVING_CURRENT_6575_8MA = (3 << 4), + LCM_DRIVING_CURRENT_6575_12MA = (2 << 4), + LCM_DRIVING_CURRENT_6575_16MA = (4 << 4) +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4, + LCM_DBI_DATA_WIDTH_32BITS = 5 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; + + +/* DSI related enumerations */ + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_DSI_FORMAT_RGB565 = 0, + LCM_DSI_FORMAT_RGB666 = 1, + LCM_DSI_FORMAT_RGB888 = 2 +} LCM_DSI_FORMAT; + + +typedef enum +{ + LCM_DSI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DSI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DSI_TRANS_SEQ; + + +typedef enum +{ + LCM_DSI_PADDING_ON_LSB = 0, + LCM_DSI_PADDING_ON_MSB = 1 +} LCM_DSI_PADDING; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +////////////////////////////////////MT6575 added params, and if lcm driver is for 6575, only care these below params + unsigned int css; + unsigned int csh; + unsigned int rd_1st; + unsigned int rd_2nd; + unsigned int wr_1st; + unsigned int wr_2nd; + + unsigned int sif_3wire; + unsigned int sif_sdi; + LCM_POLARITY sif_1st_pol; + LCM_POLARITY sif_sck_def; + unsigned int sif_div2; + unsigned int sif_hw_cs; +//////////////////////////////////// +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_hold; + unsigned int read_latency; + unsigned int wait_period; + /*only for 6575*/ + unsigned int cs_high_width; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DSI_TRANS_SEQ trans_seq; + LCM_DSI_PADDING padding; + LCM_DSI_FORMAT format; +} LCM_DSI_DATA_FORMAT; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + unsigned int i2x_en; + unsigned int i2x_edge; + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + + LCM_LANE_NUM LANE_NUM; + LCM_DSI_DATA_FORMAT data_format; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int packet_size; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int horizontal_sync_active; + unsigned int horizontal_backporch; + unsigned int horizontal_frontporch; + unsigned int horizontal_active_pixel; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; + + unsigned int lcm_int_te_monitor; + unsigned int lcm_int_te_period; + + unsigned int lcm_ext_te_monitor; + + unsigned int noncont_clock; + unsigned int noncont_clock_period; + + unsigned int force_dcs_packet; +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq_V2)(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update); + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + unsigned int (*dsi_dcs_read_lcm_reg)(unsigned char cmd); + unsigned int (*dsi_dcs_read_lcm_reg_v2)(unsigned char cmd, unsigned char *buffer, unsigned char buffer_size); + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned char pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); +///////////////////////////CABC backlight related function + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + void (*set_backlight_mode)(unsigned int mode); +/////////////////////////// + +/////////////ESD_RECOVERY////////////////////// + unsigned int (*esd_check)(void); + unsigned int (*esd_recover)(void); + +///////////////////////////////////////////////// +//Append by Jieve Liu +//Begin{ + int (*get_initialization_settings)(unsigned char table[]); + int (*set_initialization_settings)(const unsigned char table[], const int count); +//}Append by Jieve Liu +//End + +} LCM_DRIVER; + +//Append by Jieve Liu +//Begin{ +#define LCM_INIT_TABLE_SIZE_MAX 2048 +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFD // END OF REGISTERS MARKER + +typedef struct _LCM_SETTING_ITEM { + unsigned char cmd; + unsigned char count; + unsigned char params[0]; +}LCM_SETTING_ITEM; + +//}Append by Jieve Liu +//End + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/cink_peax_tinnoes77_s9091/lcm/lg4571/lg4571.c b/cink_peax_tinnoes77_s9091/lcm/lg4571/lg4571.c new file mode 100644 index 0000000..4244ee1 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/lg4571/lg4571.c @@ -0,0 +1,366 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c b/cink_peax_tinnoes77_s9091/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c new file mode 100644 index 0000000..2841d89 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c @@ -0,0 +1,252 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#else +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + //SET_RESET_PIN(0); + //MDELAY(10); + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(50); + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + + +static void lcm_suspend(void) +{ + //SET_RESET_PIN(0); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ZERO); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + MDELAY(10); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + MDELAY(10); + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ZERO); // LCM_STBY + MDELAY(10); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST + MDELAY(10); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO15, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO15, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO15, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO50, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO50, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO50, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(50); + lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE + MDELAY(120); // avoid LCD resume transint +} + +LCM_DRIVER lvds_wsvga_ti_lcm_drv = +{ + .name = "lvds_wsvga_ti", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/cink_peax_tinnoes77_s9091/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c b/cink_peax_tinnoes77_s9091/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c new file mode 100644 index 0000000..97e7c4e --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c @@ -0,0 +1,251 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#else +#if defined(MT6577) +#include +#endif +#if defined(MT6575) +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 128; + params->dpi.hsync_back_porch = 152; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 3; + params->dpi.vsync_back_porch = 12; + params->dpi.vsync_front_porch = 10; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + //SET_RESET_PIN(0); + //MDELAY(10); + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(120); + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + + +static void lcm_suspend(void) +{ + //SET_RESET_PIN(0); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ZERO); // HDMI_POWER_EN + + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ZERO); // LCM_BL_ENABLE + //MDELAY(10); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ZERO); // LVDS_SHUTDOWN_N + MDELAY(10); + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ZERO); // LCM_STBY + MDELAY(10); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST + MDELAY(10); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ZERO); // LCM_VLED_EN + MDELAY(60); // avoid LCD resume transint +} + + +static void lcm_resume(void) +{ + //SET_RESET_PIN(1); //CH7035B reset control + + //lcm_util.set_gpio_mode(GPIO60, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO60, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO60, GPIO_OUT_ONE); // HDMI_POWER_EN + + lcm_util.set_gpio_mode(GPIO48, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO48, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO48, GPIO_OUT_ONE); // LCM_STBY + MDELAY(5); + lcm_util.set_gpio_mode(GPIO52, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO52, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN + MDELAY(50); + lcm_util.set_gpio_mode(GPIO49, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO49, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST + MDELAY(5); + lcm_util.set_gpio_mode(GPIO51, GPIO_MODE_00); + lcm_util.set_gpio_dir(GPIO51, GPIO_DIR_OUT); + lcm_util.set_gpio_out(GPIO51, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N + MDELAY(120); + //lcm_util.set_gpio_mode(GPIO47, GPIO_MODE_00); + //lcm_util.set_gpio_dir(GPIO47, GPIO_DIR_OUT); + //lcm_util.set_gpio_out(GPIO47, GPIO_OUT_ONE); // LCM_BL_ENABLE +} + +LCM_DRIVER lvds_wsvga_ti_n_lcm_drv = +{ + .name = "lvds_wsvga_ti_n", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/cink_peax_tinnoes77_s9091/lcm/mt65xx_lcm_list.c b/cink_peax_tinnoes77_s9091/lcm/mt65xx_lcm_list.c new file mode 100755 index 0000000..7c33e0b --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/mt65xx_lcm_list.c @@ -0,0 +1,251 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER hx8369_6575_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_hvga_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER nt35582_mcu_6575_lcm_drv; +extern LCM_DRIVER nt35582_rgb_6575_lcm_drv; +extern LCM_DRIVER hl070na01d_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_hvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_qvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369b_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER ha5266_lcm_drv; +extern LCM_DRIVER hsd070idw1_lcm_drv; +extern LCM_DRIVER lg4571_lcm_drv; +extern LCM_DRIVER lvds_wsvga_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_n_lcm_drv; +extern LCM_DRIVER nt35565_3d_lcm_drv; +extern LCM_DRIVER tm070ddh03_lcm_drv; +extern LCM_DRIVER r61408_lcm_drv; +extern LCM_DRIVER nt35510_lcm_drv; +extern LCM_DRIVER nt35510_hvga_lcm_drv; +extern LCM_DRIVER nt35510_qvga_lcm_drv; +extern LCM_DRIVER nt35510_6517_lcm_drv; +extern LCM_DRIVER r63303_idisplay_lcm_drv; + +#if defined(GN_SSD2825_SMD_S6E8AA) +extern LCM_DRIVER gn_ssd2825_smd_s6e8aa; +#endif + +extern LCM_DRIVER otm8018b_dsi_vdo_lcm_drv; +extern LCM_DRIVER nt35510_dsi_lcm_drv; +extern LCM_DRIVER nt35512_dsi_vdo_lcm_drv; + +extern LCM_DRIVER hx8369a_dsi_6577_lcm_drv; +extern LCM_DRIVER lcdc_s9050_lcm_drv; +extern LCM_DRIVER hx8389b_qhd_dsi_vdo_lcm_drv; +extern LCM_DRIVER nt35516_dsi_tft_lcm_drv; +extern LCM_DRIVER nt35516_dsi_ips_lcm_drv; +extern LCM_DRIVER otm9608a_dsi_lcm_drv; + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(HX8369_6575) + &hx8369_6575_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(NT35582_MCU_6575) + &nt35582_mcu_6575_lcm_drv, +#endif + +#if defined(NT35582_RGB_6575) + &nt35582_rgb_6575_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(R61408) + &r61408_lcm_drv, +#endif + +#if defined(HX8369_DSI_VDO) + &hx8369_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI) + &hx8369_dsi_6575_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_HVGA) + &hx8369_dsi_6575_hvga_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_QVGA) + &hx8369_dsi_6575_qvga_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(NT35510) + &nt35510_lcm_drv, +#endif + +#if defined(NT35510_HVGA) + &nt35510_hvga_lcm_drv, +#endif + +#if defined(NT35510_QVGA) + &nt35510_qvga_lcm_drv, +#endif + +#if defined(NT35510_6517) + &nt35510_6517_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(HA5266) + &ha5266_lcm_drv, +#endif + +#if defined(HSD070IDW1) + &hsd070idw1_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI) + &hx8363_6575_dsi_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI_HVGA) + &hx8363_6575_dsi_hvga_lcm_drv, +#endif + +#if defined(LG4571) + &lg4571_lcm_drv, +#endif + +#if defined(LVDS_WSVGA) + &lvds_wsvga_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI) + &lvds_wsvga_ti_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI_N) + &lvds_wsvga_ti_n_lcm_drv, +#endif + +#if defined(NT35565_3D) + &nt35565_3d_lcm_drv, +#endif + +#if defined(TM070DDH03) + &tm070ddh03_lcm_drv, +#endif + +#if defined(HL070NA01D) + &hl070na01d_lcm_drv, +#endif + +#if defined(R63303_IDISPLAY) + &r63303_idisplay_lcm_drv, +#endif + +#if defined(HX8369B_DSI_VDO) + &hx8369b_dsi_vdo_lcm_drv, +#endif + +#if defined(GN_SSD2825_SMD_S6E8AA) + &gn_ssd2825_smd_s6e8aa, +#endif + +#if defined(OTM8018B_DSI_VDO) + &otm8018b_dsi_vdo_lcm_drv, +#endif + +#if defined(NT35510_DSI) + &nt35510_dsi_lcm_drv, +#endif + +#if defined(NT35512_DSI_VDO) + &nt35512_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369A_6577_DSI) + &hx8369a_dsi_6577_lcm_drv, +#endif + +#if defined(HX8369B_QHD_DSI_VDO) + &hx8389b_qhd_dsi_vdo_lcm_drv, +#endif + +#if defined(NT35516_QHD_DSI_CMD_TFT9K1342) + &nt35516_dsi_tft_lcm_drv, +#endif + +#if defined(NT35516_QHD_DSI_CMD_IPS9K1431) + &nt35516_dsi_ips_lcm_drv, +#endif + +#if defined(OTM9608_QHD_DSI_CMD) + &otm9608a_dsi_lcm_drv, +#endif + +#if defined(TRULY_S9050_DPI) + &lcdc_s9050_lcm_drv, +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/cink_peax_tinnoes77_s9091/lcm/mtk_cust.mk b/cink_peax_tinnoes77_s9091/lcm/mtk_cust.mk new file mode 100755 index 0000000..c180615 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/mtk_cust.mk @@ -0,0 +1,3 @@ +# Used for UBOOT +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/cink_peax_tinnoes77_s9091/lcm/nt35510/nt35510.c b/cink_peax_tinnoes77_s9091/lcm/nt35510/nt35510.c new file mode 100644 index 0000000..1c1754f --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/nt35510/nt35510.c @@ -0,0 +1,604 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Bit rate calculation + params->dsi.pll_div1=34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + params->dsi.HS_TRAIL = 10;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_ZERO = 8;//min 105ns+6*UI + params->dsi.HS_PRPR = 4;//min 40ns+4*UI; max 85ns+6UI + params->dsi.LPX = 12;//min 50ns + + params->dsi.TA_GO = 12;//4*LPX + + params->dsi.CLK_TRAIL = 5;//min 60ns + params->dsi.CLK_ZERO = 18;//min 300ns-38ns + params->dsi.LPX_WAIT = 10; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = 4;//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00053902; + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00123902; + data_array[1]=0x000201F8; + data_array[2]=0x00133320; + data_array[3]=0x23000040; + data_array[4]=0x00C89902; + data_array[5]=0x00001100; + dsi_set_cmdq(data_array, 6, 1); + + +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(data_array, 2, 1); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00B21500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(data_array, 2, 1); + + //data_array[0]=0x01BF1500; + //dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x242424BA; + dsi_set_cmdq(data_array, 2, 1); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(data_array, 2, 1); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(data_array, 15, 1); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(data_array, 1, 1); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(data_array, 1, 1); +// MDELAY(10); +/* + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(data_array, 1, 1); +*/ +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(10); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, %d\n", __func__, level); +#else + printk("lcm_setbacklight = %d\n", level); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + lcm_init(); + data_array[0]=0x00110500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0]=0x00290500; + dsi_set_cmdq(data_array, 1, 1); +} + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (854) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Bit rate calculation + params->dsi.pll_div1=34; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + params->dsi.HS_TRAIL = 10;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_ZERO = 8;//min 105ns+6*UI + params->dsi.HS_PRPR = 4;//min 40ns+4*UI; max 85ns+6UI + params->dsi.LPX = 12;//min 50ns + + params->dsi.TA_GO = 12;//4*LPX + + params->dsi.CLK_TRAIL = 5;//min 60ns + params->dsi.CLK_ZERO = 18;//min 300ns-38ns + params->dsi.LPX_WAIT = 10; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = 4;//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + + +//AVDD: 5.0V + data_array[0]=0x00043902; + data_array[1]=0x0A0A0AB0; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x444444B6; + dsi_set_cmdq(data_array, 2, 1); + +//AVEE: -5.0V + data_array[0]=0x00043902; + data_array[1]=0x0A0A0AB1; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x343434B7; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x242424B9; + dsi_set_cmdq(data_array, 2, 1); + +//#VGLX:-13V + data_array[0]=0x00043902; + data_array[1]=0x080808B5; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x141414BA; + dsi_set_cmdq(data_array, 2, 1); + +//#VGMP:4.7V /VGSP:0V + data_array[0]=0x00043902; + data_array[1]=0x008800BC; + dsi_set_cmdq(data_array, 2, 1); + +//#VGMN:-4.7V /VGSN:0V + data_array[0]=0x00043902; + data_array[1]=0x008800BD; + dsi_set_cmdq(data_array, 2, 1); + +//##VCOM Setting + data_array[0]=0x00033902; + data_array[1]=0x002D00BE; + dsi_set_cmdq(data_array, 2, 1); + +//VCL + data_array[0]=0x00043902; + data_array[1]=0x020202B2; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00043902; + data_array[1]=0x242424B8; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(data_array, 3, 1); + +//# R+ + data_array[0]=0x00353902; + data_array[1]=0x002900D1; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FA02EF; + data_array[14]=0x00000060; + dsi_set_cmdq(data_array, 15, 1); + +//#G + + data_array[0]=0x00353902; + data_array[1]=0x002900D2; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FD02EF; + data_array[14]=0x00000000; + dsi_set_cmdq(data_array, 15, 1); + +//#B + + data_array[0]=0x00353902; + data_array[1]=0x002900D3; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x02F502EF; + data_array[14]=0x000000D0; + dsi_set_cmdq(data_array, 15, 1); + +//#R - + data_array[0]=0x00353902; + data_array[1]=0x002900D4; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FA02EF; + data_array[14]=0x00000060; + dsi_set_cmdq(data_array, 15, 1); + +//#G - + data_array[0]=0x00353902; + data_array[1]=0x002900D5; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x03FD02EF; + data_array[14]=0x00000000; + dsi_set_cmdq(data_array, 15, 1); + +//#B - + data_array[0]=0x00353902; + data_array[1]=0x002900D6; + data_array[2]=0x00330030; + data_array[3]=0x0068004A; + data_array[4]=0x01C9009F; + data_array[5]=0x01310105; + data_array[6]=0x019A0170; + data_array[7]=0x021402E0; + data_array[8]=0x02410215; + data_array[9]=0x0286026E; + data_array[10]=0x02AF02A0; + data_array[11]=0x02CE02C1; + data_array[12]=0x02E302DC; + data_array[13]=0x02F502EF; + data_array[14]=0x000000D0; + dsi_set_cmdq(data_array, 15, 1); +//####### ENABLE PAGE 0 ############ + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(data_array, 3, 1); +//################################### +//#Vivid Color + data_array[0]=0x10B41500; + dsi_set_cmdq(data_array, 1, 1); + +//#480*854 + data_array[0]=0x6CB51500; + dsi_set_cmdq(data_array, 1, 1); + +//#SDT + data_array[0]=0x05B61500; + dsi_set_cmdq(data_array, 1, 1); + +//#2dot-Inversion + data_array[0]=0x00043902; + data_array[1]=0x020202BC; + dsi_set_cmdq(data_array, 2, 1); + +//#Display option control-> video mode + data_array[0]=0x00033902; + data_array[1]=0x0000D4B1; + dsi_set_cmdq(data_array, 2, 1); + data_array[0]=0x00063902; + data_array[1]=0x500200C9; + data_array[2]=0x00005050; + dsi_set_cmdq(data_array, 3, 1); + +//#Gate EQ for rising edge + data_array[0]=0x00033902; + data_array[1]=0x008080B7; + dsi_set_cmdq(data_array, 2, 1); + +//#Source EQ + data_array[0]=0x00053902; + data_array[1]=0x070701B8; + data_array[2]=0x00000007; + dsi_set_cmdq(data_array, 3, 1); + data_array[0]=0x00053902; + data_array[1]=0x0100002A; + data_array[2]=0x000000DF; + dsi_set_cmdq(data_array, 3, 1); + data_array[0]=0x00053902; + data_array[1]=0x0300002B; + data_array[2]=0x00000055; + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]=0x00351500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x0055; + dsi_set_cmdq(data_array, 2, 1); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(data_array, 2, 1); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(10); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, lcm_setbacklight level=%d\n", __func__,level); + MDELAY(50); +#else + printk("lcm_setbacklight level=%d\n",level); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(data_array, 2, 1); +} + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + lcm_init(); + data_array[0]=0x00110500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); + + data_array[0]=0x00290500; + dsi_set_cmdq(data_array, 1, 1); +} + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#if defined(BUILD_UBOOT) + #include + #define LCM_PRINT printf + #ifndef KERN_INFO + #define KERN_INFO + #endif +#else + #include + #include + #define LCM_PRINT printk +#endif + +#if 1 +#define LCM_DBG(fmt, arg...) \ + LCM_PRINT("[LCM-NT35510-DSI] %s (line:%d) :" fmt "\r\n", __func__, __LINE__, ## arg) +#else +#define LCM_DBG(fmt, arg...) do {} while (0) +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_ID (0x80) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define LCM_DSI_CMD_MODE 1 + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update); +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update); +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) +#ifndef GPIO_LCD_BACKLIGHT_EN_PIN +#define GPIO_LCD_BACKLIGHT_EN_PIN GPIO68 +#define GPIO_LCD_BACKLIGHT_EN_PIN_M_GPIO GPIO_MODE_GPIO +#endif + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void config_gpio(void) +{ + LCM_DBG(); + mt_set_gpio_mode(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_LCD_BACKLIGHT_EN_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_DIR_OUT); + mt_set_gpio_pull_enable(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_PULL_DISABLE); + mt_set_gpio_out(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_OUT_ZERO); +} + +static void light_lcd_on(int on) +{ + LCM_DBG("on=%d", on); + if ( on ){ + #ifdef BUILD_UBOOT + mt_set_gpio_out(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_OUT_ONE); + #endif + } + else{ + #ifdef BUILD_UBOOT + mt_set_gpio_out(GPIO_LCD_BACKLIGHT_EN_PIN, GPIO_OUT_ZERO); + #endif + } +} + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + //#Enable Page1 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x01}}, + {REGFLAG_DELAY, 1, {}}, + //# AVDD: manual, + {0xB6, 3, {0x34,0x34,0x34}}, + {REGFLAG_DELAY, 1, {}}, + {0xB0, 3, {0x0C,0x0C,0x0C}}, + {REGFLAG_DELAY, 1, {}}, + //# AVEE: manual, \6V + {0xB7, 3, {0x24,0x24,0x24}}, + {REGFLAG_DELAY, 1, {}}, + {0xB1, 3, {0x0C,0x0C,0x0C}}, + {REGFLAG_DELAY, 1, {}}, + + //#Power Control for VCL + {0xB8, 1, {0x34}}, + {REGFLAG_DELAY, 1, {}}, + {0xB2, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + //# VGH: Clamp Enable, + {0xB9, 3, {0x34,0x34,0x34}},//{0x24,0x24,0x24} + {REGFLAG_DELAY, 1, {}}, + {0xB3, 3, {0x08,0x08,0x08}}, + {REGFLAG_DELAY, 1, {}}, + + //# VGL(LVGL): + {0xBA, 3, {0x24,0x24,0x24}},//{0x24,0x24,0x24} + {REGFLAG_DELAY, 1, {}}, + + //# VGL_REG(VGLO) + {0xB5, 3, {0x08,0x08,0x08}}, + {REGFLAG_DELAY, 1, {}}, + + //# VGMP/VGSP: + {0xBC, 3, {0x00,0x80,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + //# VGMN/VGSN + {0xBD, 3, {0x00,0x80,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + //# VCOM=\0.1 + {0xBE, 2, {0x00,0x2F}},//{0x00,0x48} + {REGFLAG_DELAY, 1, {}}, + + //#R+ + {0xD1, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#G+ + {0xD2, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#B+ + {0xD3, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#R- + {0xD4, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#G- + {0xD5, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 1, {}}, + //#B- + {0xD6, 52, {0x00,0x37,0x00,0x53,0x00,0x79,0x00,0x97,0x00,0xB1, + 0x00,0xD5,0x00,0xF4,0x01,0x23,0x01,0x49,0x01,0x87, + 0x01,0xB6,0x02,0x00,0x02,0x3B,0x02,0x3D,0x02,0x75, + 0x02,0xB1,0x02,0xD5,0x03,0x09,0x03,0x28,0x03,0x52, + 0x03,0x6B,0x03,0x8D,0x03,0xA2,0x03,0xBB,0x03,0xC1, + 0x03,0xC1}}, + {REGFLAG_DELAY, 10, {}}, + + //#Enable Page0 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + //# Color Enhance Setting + {0xB4, 1, {0x00}},// 1: enable, 0:disable + {REGFLAG_DELAY, 3, {}}, + + //# RGB I/F Setting + {0xB0, 5, {0x00,0x05,0x02,0x05,0x02}},//{0x0F,0x05,0x02,0x05,0x02} + {REGFLAG_DELAY, 1, {}}, + + //## SDT: + {0xB6, 1, {0x05}},//{0x07} + {REGFLAG_DELAY, 1, {}}, + + //EQ for gate + {0xB7, 2, {0x70,0x70}},//{0x71,0x71} + {REGFLAG_DELAY, 1, {}}, + + //EQ for source + {0xB8, 4, {0x01,0x05,0x05,0x05}},//{0x01,0x0A,0x0A,0x0A} + {REGFLAG_DELAY, 1, {}}, + + //# Inversion: Column + {0xBC, 3, {0x02,0x02,0x02}}, + {REGFLAG_DELAY, 1, {}}, + + //# BOE's Setting (default) + {0xCC, 3, {0x03,0x50,0x50}}, + {REGFLAG_DELAY, 1, {}}, + + //# Display Timing: + {0xBD, 5, {0x01,0x84,0x07,0x31,0x00}},//{0x01,0x00,0x07,0x31,0x00} + {REGFLAG_DELAY, 1, {}}, + //{0xBE, 5, {0x01,0x84,0x07,0x31,0x00}}, + //{REGFLAG_DELAY, 3, {}}, + //{0xBF, 5, {0x01,0x84,0x07,0x31,0x00}}, + //{REGFLAG_DELAY, 3, {}}, + + //#Disable manufacture command set + {0xF0, 5, {0x55,0xAA,0x52,0x00,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x3A, 1, {0x77}}, + {REGFLAG_DELAY, 1, {}}, + + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {REGFLAG_DELAY, 1, {}}, + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x51, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + {0x29, 0, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + //#Enable Page 0 + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + //#VScan + + //(vodeo mode&command mode) + //{0xB1, 2, {0xF8,0x00}}, + //0512-87172138-7122, 15950021248 + //(only command mode) + {0xB1, 2, {0xE8,0x00}}, + {REGFLAG_DELAY, 1, {}}, + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + //#Disable manufacture command set + {0xF0, 5, {0x55,0xAA,0x52,0x00,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + //#Disable manufacture command set + {0xF0, 5, {0x55,0xAA,0x52,0x00,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + //#Disable manufacture command set + {0xF0, 5, {0x55,0xAA,0x52,0x00,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_disable_manufacture_setting[] = { + //#Disable manufacture command set + {0xF0, 5, {0x55,0xAA,0x52,0x00,0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void dsi_send_cmdq_tinno(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update) +{ + unsigned int item[16]; + unsigned char dsi_cmd = (unsigned char)cmd; + unsigned char dc; + int index = 0, length = 0; + + memset(item,0,sizeof(item)); + if(count+1 > 60) + { + LCM_DBG("Exceed 16 entry\n"); + return; + } +/* + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 +*/ + if(count == 0) + { + item[0] = 0x0500 | (dsi_cmd<<16); + length = 1; + } + else if(count == 1) + { + item[0] = 0x1500 | (dsi_cmd<<16) | (para_list[0]<<24); + length = 1; + } + else + { + item[0] = 0x3902 | ((count+1)<<16);//Count include command. + ++length; + while(1) + { + if (index == count+1) + break; + if ( 0 == index ){ + dc = cmd; + }else{ + dc = para_list[index-1]; + } + item[index/4+1] |= (dc<<(8*(index%4))); + if ( index%4 == 0 ) ++length; + ++index; + } + } + + dsi_set_cmdq(&item, length, force_update); + +} + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: +// dsi_send_cmdq_tinno(cmd, table[i].count, table[i].para_list, force_update); + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + LCM_DBG(); + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + LCM_DBG(); + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; //0x07 + params->dsi.vertical_frontporch=2; //0x31 + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38;//0x1A; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + params->dsi.LPX = 13; //read =7-12, write=13 + +} + +static void lcm_init(void) +{ + LCM_DBG(); + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_suspend(void) +{ + LCM_DBG(); + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_resume(void) +{ + LCM_DBG(); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); +} + +static void lcm_setbacklight(unsigned int level) +{ + LCM_DBG("level=%d", level); + // Refresh value of backlight level. + //level = 0xFF; + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); + + light_lcd_on( level ); +} + +static void lcm_setpwm(unsigned int divider) +{ + LCM_DBG(); + // TBD +} + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +/*Begin lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) +/*End lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + unsigned int div2_real=0; + unsigned int cycle_time = 0; + unsigned int ui = 0; + unsigned int hs_trail_m, hs_trail_n; + #define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + div2_real=params->dsi.pll_div2 ? params->dsi.pll_div2*0x02 : 0x1; + cycle_time = (8 * 1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)); + ui = (1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)) + 1; + + hs_trail_m=params->dsi.LANE_NUM; + hs_trail_n=NS_TO_CYCLE(((params->dsi.LANE_NUM * 4 * ui) + 60), cycle_time); + +// params->dsi.HS_TRAIL = ((hs_trail_m > hs_trail_n) ? hs_trail_m : hs_trail_n) + 3;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_TRAIL = 20; + params->dsi.HS_ZERO = NS_TO_CYCLE((115 + 6 * ui), cycle_time);//min 105ns+6*UI + params->dsi.HS_PRPR = NS_TO_CYCLE((50 + 4 * ui), cycle_time);//min 40ns+4*UI; max 85ns+6UI + // HS_PRPR can't be 1. + if (params->dsi.HS_PRPR < 2) + params->dsi.HS_PRPR = 2; + + params->dsi.LPX = NS_TO_CYCLE(200, cycle_time);//min 50ns + + params->dsi.TA_SACK = 1; + params->dsi.TA_GET = 5 * params->dsi.LPX;//5*LPX + params->dsi.TA_SURE = 3 * params->dsi.LPX / 2;//min LPX; max 2*LPX; + params->dsi.TA_GO = 4 * params->dsi.LPX;//4*LPX + + params->dsi.CLK_TRAIL = NS_TO_CYCLE(70, cycle_time);//min 60ns + // CLK_TRAIL can't be 1. + if (params->dsi.CLK_TRAIL < 2) + params->dsi.CLK_TRAIL = 2; + params->dsi.CLK_ZERO = NS_TO_CYCLE((300), cycle_time);//min 300ns-38ns + params->dsi.LPX_WAIT = 1; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = NS_TO_CYCLE((38 + 95) / 2, cycle_time);//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00B21500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x01BF1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x343434BA; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(&data_array, 1, 1); +// MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(200); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + + data_array[0] = 0x002C0500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00110500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); + + data_array[0]=0x00290500; + dsi_set_cmdq(&data_array, 1, 1); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, \n", __func__); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(&data_array, 2, 1); +} + + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +/*Begin lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ +#define LCM_ID (0x55) +#define LCM_ID1 (0xC1) +#define LCM_ID2 (0x80) +/*End lenovo-sw wengjun1 add for p700 lcd compatile 2012-3-5*/ + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + unsigned int div2_real=0; + unsigned int cycle_time = 0; + unsigned int ui = 0; + unsigned int hs_trail_m, hs_trail_n; + #define NS_TO_CYCLE(n, c) ((n) / c + (( (n) % c) ? 1 : 0)) + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + div2_real=params->dsi.pll_div2 ? params->dsi.pll_div2*0x02 : 0x1; + cycle_time = (8 * 1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)); + ui = (1000 * div2_real)/ (26 * (params->dsi.pll_div1+0x01)) + 1; + + hs_trail_m=params->dsi.LANE_NUM; + hs_trail_n=NS_TO_CYCLE(((params->dsi.LANE_NUM * 4 * ui) + 60), cycle_time); + +// params->dsi.HS_TRAIL = ((hs_trail_m > hs_trail_n) ? hs_trail_m : hs_trail_n) + 3;//min max(n*8*UI, 60ns+n*4UI) + params->dsi.HS_TRAIL = 20; + params->dsi.HS_ZERO = NS_TO_CYCLE((115 + 6 * ui), cycle_time);//min 105ns+6*UI + params->dsi.HS_PRPR = NS_TO_CYCLE((50 + 4 * ui), cycle_time);//min 40ns+4*UI; max 85ns+6UI + // HS_PRPR can't be 1. + if (params->dsi.HS_PRPR < 2) + params->dsi.HS_PRPR = 2; + + params->dsi.LPX = NS_TO_CYCLE(200, cycle_time);//min 50ns + + params->dsi.TA_SACK = 1; + params->dsi.TA_GET = 5 * params->dsi.LPX;//5*LPX + params->dsi.TA_SURE = 3 * params->dsi.LPX / 2;//min LPX; max 2*LPX; + params->dsi.TA_GO = 4 * params->dsi.LPX;//4*LPX + + params->dsi.CLK_TRAIL = NS_TO_CYCLE(70, cycle_time);//min 60ns + // CLK_TRAIL can't be 1. + if (params->dsi.CLK_TRAIL < 2) + params->dsi.CLK_TRAIL = 2; + params->dsi.CLK_ZERO = NS_TO_CYCLE((300), cycle_time);//min 300ns-38ns + params->dsi.LPX_WAIT = 1; + params->dsi.CONT_DET = 0; + + params->dsi.CLK_HS_PRPR = NS_TO_CYCLE((38 + 95) / 2, cycle_time);//min 38ns; max 95ns +} + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +//*************Enable CMD2 Page1 *******************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +//************* AVDD: manual *******************// + data_array[0]=0x00043902; + data_array[1]=0x343434B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x090909B0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE: manual, -6V + data_array[1]=0x242424B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//AVEE voltage, Set AVEE -6V + data_array[1]=0x090909B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //Power Control for VCL + data_array[0]=0x34B81500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00B21500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGH: Clamp Enable + data_array[1]=0x242424B9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902; + data_array[1]=0x050505B3; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x01BF1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGL(LVGL) + data_array[1]=0x343434BA; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGL_REG(VGLO) + data_array[0]=0x00043902; + data_array[1]=0x0B0B0BB5; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + //VGMP/VGSP + data_array[0]=0x00043902; + data_array[1]=0x00A300BC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//VGMN/VGSN + data_array[1]=0x00A300BD; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00033902;//VCOM=-0.1 + data_array[1]=0x005000BE; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D1; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D2; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D3; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D4; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D5; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + + data_array[0]=0x00353902; + data_array[1]=0x003700D6; + data_array[2]=0x007B0052; + data_array[3]=0x00B10099; + data_array[4]=0x01F600D2; + data_array[5]=0x014E0127; + data_array[6]=0x02BE018C; + data_array[7]=0x0248020B; + data_array[8]=0x027E024A; + data_array[9]=0x03E102BC; + data_array[10]=0x03310310; + data_array[11]=0x0373035A; + data_array[12]=0x039F0394; + data_array[13]=0x03B903B3; + data_array[14]=0x000000C1; + dsi_set_cmdq(&data_array, 15, 1); + MDELAY(10); + +// ******************** EABLE CMD2 PAGE 0 **************// + + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00063902;//I/F Setting + data_array[1]=0x020500B0; + data_array[2]=0x00000205; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x0AB61500;//SDT + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00033902;//Set Gate EQ + data_array[1]=0x000000B7; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00053902;//Set Source EQ + data_array[1]=0x050501B8; + data_array[2]=0x00000005; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00043902;//Inversion: Column inversion (NVT) + data_array[1]=0x020202BC;//0x000000BC + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00043902;//BOE's Setting (default) + data_array[1]=0x000003CC; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00063902;//Display Timing + data_array[1]=0x078401BD; + data_array[2]=0x00000031; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x01BA1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x2555AAF0; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* + data_array[0]=0x00053902;//Enable Test mode + data_array[1]=0x2555AAFF; + data_array[2]=0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); +*/ + + data_array[0]=0x773A1500;//TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +// data_array[0] = 0x00351500;// TE ON +// dsi_set_cmdq(&data_array, 1, 1); +// MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(200); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + + data_array[0] = 0x002C0500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + +//******************* ENABLE PAGE0 **************// + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + +/* data_array[0]=0x02C71500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0]=0x00053902; + data_array[1]=0x000011C9; + data_array[2]=0x00000000; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0]=0x00211500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(120); +*/ + data_array[0] = 0x00351500;// TE ON + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0]= 0x00033902; + data_array[1]= 0x0000E8B1; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0051; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x2453; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x0155; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00023902; + data_array[1]= 0x705e; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + + data_array[0]= 0x00033902; + data_array[1]= 0x000301E0; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(50); + +} + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(150); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00280500; + dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(50); + + data_array[0]=0x00100500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); +} + + +static void lcm_resume(void) +{ + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + unsigned int data_array[16]; + + data_array[0]=0x00110500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(150); + + data_array[0]=0x00290500; + dsi_set_cmdq(&data_array, 1, 1); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + +#if defined(BUILD_UBOOT) + printf("%s, \n", __func__); +#endif + + if(level > 255) + level = 255; + + data_array[0]= 0x00023902; + data_array[1] =(0x51|(level<<8)); + dsi_set_cmdq(&data_array, 2, 1); +} + + +void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#if defined(BUILD_UBOOT) + #include + #define LCM_PRINT printf + #ifndef KERN_INFO + #define KERN_INFO + #endif +#else +#include + #include + #define LCM_PRINT printk +#endif + +#if 0 +#define LCM_DBG(fmt, arg...) \ + LCM_PRINT("[NT35516-IPS] %s (line:%d) :" fmt "\r\n", __func__, __LINE__, ## arg) +#else +#define LCM_DBG(fmt, arg...) do {} while (0) +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) +#define LCM_DSI_CMD_MODE + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +//#define read_reg(cmd) lcm_util.DSI_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define TCL_GAMMA_24 +//GAMMA 24 +static unsigned char lcm_initialization_setting[LCM_INIT_TABLE_SIZE_MAX] = { +/* cmd, count, params*/ + 0xFF, 5, 0xAA,0x55,0x25,0x01,0x00, + + 0xF2, 35, 0x00,0x00,0x4A,0x0A,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x51,0x00,0x01,0x00,0x01, + + 0xF3, 7, 0x02,0x03,0x07,0x45,0x88,0xd1,0x0D, + + //#LV2 Page 0 enable + 0xF0, 5, 0x55,0xAA,0x52,0x08,0x00, + 0xB8, 4, 0x01,0x02,0x02,0x02,//CHG + + //#Display control + 0xB1, 3, 0xCC, 0x00, 0x00, + //#Timing control 4H w/ 4-delay + 0xC9, 6, 0x63,0x06,0x0D,0x1A,0x17,0x00, + // Frame rate + 0xBD, 5, 0x01,0x41,0x10,0x38,0x01,/*default 63Hz*/ +// 0xBD, 5, 0x01,0x64,0x10,0x38,0x01,/*default 57Hz*/ + //0xBD, 5, 0x01,0x71,0x10,0x38,0x01,/*default 55Hz*/ + //0xBD, 5, 0x01,0x96,0x10,0x38,0x01,/*default 50Hz*/ + + 0xBC, 3, 0x00, 0x00, 0x00, //colume invert + + //LV2 Page 1 enable + 0xF0, 5, 0x55, 0xAA, 0x52,0x08,0x01, + + //AVDD Set AVDD + 0xB0, 3, 0x05, 0x05, 0x05, + //#AVEE + 0xB1, 3, 0x05, 0x05, 0x05, + //#VCL + 0xB2, 3, 0x01, 0x01, 0x01, + //#VGH + 0xB3, 3, 0x0e, 0x0e, 0x0e, + //#VGLX + 0xB4, 3, 0x0a, 0x0a, 0x0a, + + //BT1 Power Control for AVDD + 0xB6, 3, 0x44, 0x44, 0x44, //CHG @huangns 20120718 change avdd boosting times old {0xB6, 3, {0x44, 0x44, 0x44}}, + + 0xB7, 3, 0x34, 0x34, 0x34, + 0xB8, 3, 0x20, 0x20, 0x20, + + 0xB9, 3, 0x24, 0x24, 0x24, + 0xBA, 3, 0x14, 0x14, 0x14, + + //Setting VGMP and VGSP Voltage + 0xBC, 3, 0x00, 0xc8, 0x00, + + //Setting VGMN and VGSN Voltage + 0xBD, 3, 0x00, 0xc8, 0x00, + + //Setting VCOM Offset Voltage + 0xBE, 1, 0x64, + + //General Purpose Output Pins Control + 0xC0, 2, 0x04, 0x00, + 0xca, 1, 0x00, + + 0xD0, 4, 0x0a,0x10,0x0d,0x0f, + + //#Gamma Setting + //R+ + 0xD1, 16, 0x00,0xa0,0x00,0xde,0x01,0x37,0x01,0x55,0x01,0x68,0x01,0x7f,0x01,0xa5,0x01,0xb1, + 0xD2, 16, 0x01,0xda,0x01,0xff,0x02,0x27,0x02,0x58,0x02,0x85,0x02,0x87,0x02,0xb0,0x02,0xe7, + 0xD3, 16, 0x03,0x04,0x03,0x22,0x03,0x3e,0x03,0x50,0x03,0x77,0x03,0x90,0x03,0xa0,0x03,0xdf, + 0xD4, 4, 0x03,0xfd,0x03,0xff, + + //G+ + 0xD5, 16, 0x00,0xa0,0x00,0xde,0x01,0x37,0x01,0x55,0x01,0x68,0x01,0x7f,0x01,0xa5,0x01,0xb1, + 0xD6, 16, 0x01,0xda,0x01,0xff,0x02,0x27,0x02,0x58,0x02,0x85,0x02,0x87,0x02,0xb0,0x02,0xe7, + 0xD7, 16, 0x03,0x04,0x03,0x22,0x03,0x3e,0x03,0x50,0x03,0x77,0x03,0x90,0x03,0xa0,0x03,0xdf, + 0xD8, 4, 0x03,0xfd,0x03,0xff, + + //B+ + 0xD9, 16, 0x00,0xa0,0x00,0xde,0x01,0x37,0x01,0x55,0x01,0x68,0x01,0x7f,0x01,0xa5,0x01,0xb1, + 0xDd, 16, 0x01,0xda,0x01,0xff,0x02,0x27,0x02,0x58,0x02,0x85,0x02,0x87,0x02,0xb0,0x02,0xe7, + 0xDe, 16, 0x03,0x04,0x03,0x22,0x03,0x3e,0x03,0x50,0x03,0x77,0x03,0x90,0x03,0xa0,0x03,0xdf, + 0xDf, 4, 0x03,0xfd,0x03,0xff, + + //R- + 0xe0, 16, 0x00,0xa0,0x00,0xde,0x01,0x37,0x01,0x55,0x01,0x68,0x01,0x7f,0x01,0xa5,0x01,0xb1, + 0xe1, 16, 0x01,0xda,0x01,0xff,0x02,0x27,0x02,0x58,0x02,0x85,0x02,0x87,0x02,0xb0,0x02,0xe7, + 0xe2, 16, 0x03,0x04,0x03,0x22,0x03,0x3e,0x03,0x50,0x03,0x77,0x03,0x90,0x03,0xa0,0x03,0xdf, + 0xe3, 4, 0x03,0xfd,0x03,0xff, + + //G- + 0xe4, 16, 0x00,0xa0,0x00,0xde,0x01,0x37,0x01,0x55,0x01,0x68,0x01,0x7f,0x01,0xa5,0x01,0xb1, + 0xe5, 16, 0x01,0xda,0x01,0xff,0x02,0x27,0x02,0x58,0x02,0x85,0x02,0x87,0x02,0xb0,0x02,0xe7, + 0xe6, 16, 0x03,0x04,0x03,0x22,0x03,0x3e,0x03,0x50,0x03,0x77,0x03,0x90,0x03,0xa0,0x03,0xdf, + 0xe7, 4, 0x03,0xfd,0x03,0xff, + + //B- + 0xe8, 16, 0x00,0xa0,0x00,0xde,0x01,0x37,0x01,0x55,0x01,0x68,0x01,0x7f,0x01,0xa5,0x01,0xb1, + 0xe9, 16, 0x01,0xda,0x01,0xff,0x02,0x27,0x02,0x58,0x02,0x85,0x02,0x87,0x02,0xb0,0x02,0xe7, + 0xea, 16, 0x03,0x04,0x03,0x22,0x03,0x3e,0x03,0x50,0x03,0x77,0x03,0x90,0x03,0xa0,0x03,0xdf, + 0xeb, 4, 0x03,0xfd,0x03,0xff, + + 0x3A, 1, 0x77, + +// 0x36, 1, 0x10, + + 0x35, 1, 0x00,/*TE ON, mode=0*/ + 0x44, 2, 0x01, 0xE0,/* TE start line = 960/2 */ + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + REGFLAG_DELAY, 1, + + // Setting ending by predefined flag + REGFLAG_END_OF_TABLE +}; + +static unsigned char lcm_sleep_out_setting[] = { + // Sleep Out + 0x11, 0, + REGFLAG_DELAY, 200, + + // Display ON + 0x29, 0, + REGFLAG_DELAY, 50, + + REGFLAG_END_OF_TABLE +}; + +static unsigned char lcm_sleep_mode_in_setting[] = { + // Display off sequence + 0x28, 0, + REGFLAG_DELAY, 100, + + // Sleep Mode On + 0x10, 0, + REGFLAG_DELAY, 200, + REGFLAG_END_OF_TABLE +}; + +static unsigned char lcm_compare_id_setting[] = { + // Display off sequence + 0xF0, 5, 0x55, 0xaa, 0x52,0x08,0x00, + + REGFLAG_DELAY, 10, + + REGFLAG_END_OF_TABLE +}; + +static int push_table(unsigned char table[]) +{ + unsigned int i, bExit = 0; + unsigned char *p = (unsigned char *)table; + LCM_SETTING_ITEM *pSetting_item; + + while(!bExit) { + pSetting_item = (LCM_SETTING_ITEM *)p; + + switch (pSetting_item->cmd) { + + case REGFLAG_DELAY : + MDELAY(pSetting_item->count); + p += 2; + break; + + case REGFLAG_END_OF_TABLE : + p += 2; + bExit = 1; + break; + + default: + dsi_set_cmdq_V2(pSetting_item->cmd, + pSetting_item->count, pSetting_item->params, 1); + MDELAY(12); + p += pSetting_item->count + 2; + break; + } + } + return p - table; //return the size of settings array. +} + +#ifndef BUILD_UBOOT +static int get_initialization_settings(unsigned char table[]) +{ + memcpy(table, lcm_initialization_setting, sizeof(lcm_initialization_setting)); + return sizeof(lcm_initialization_setting); +} + +static void lcm_init(void); +static void lcm_reset(void); + +static int set_initialization_settings(const unsigned char table[], const int count) +{ + if ( count > LCM_INIT_TABLE_SIZE_MAX ){ + return -EIO; + } + memset(lcm_initialization_setting, REGFLAG_END_OF_TABLE, sizeof(lcm_initialization_setting)); + memcpy(lcm_initialization_setting, table, count); + lcm_reset(); + lcm_init(); + push_table(lcm_sleep_out_setting); + + return count; +} +#endif +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + params->dsi.packet_size=256; + + params->dsi.force_dcs_packet=1; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.vertical_sync_active = 3; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=20; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=0; // div2=0~15: fout=fvo/(2*div2) +} + +static void lcm_reset(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(128); +} + +static void lcm_init(void) +{ + LCM_DBG(); + push_table(lcm_initialization_setting); +} + +static void lcm_suspend(void) +{ + LCM_DBG(); + unsigned int data_array[2]; + + data_array[0] = 0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +} + +static void lcm_resume(void) +{ + LCM_DBG(); +#ifdef BUILD_UBOOT + lcm_reset(); + lcm_init(); +#endif + push_table(lcm_sleep_out_setting); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); +} + +#if defined BUILD_UBOOT +#include "cust_adc.h" +#define LCM_MAX_VOLTAGE 2000 +#define LCM_MIN_VOLTAGE 1600 + +extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata); + +static unsigned int lcm_adc_read_chip_id() +{ + int data[4] = {0, 0, 0, 0}; + int tmp = 0, rc = 0, iVoltage = 0; + rc = IMM_GetOneChannelValue(AUXADC_LCD_ID_CHANNEL, data, &tmp); + if(rc < 0) { + printf("read LCD_ID vol error--Liu\n"); + return 0; + } + else { + iVoltage = (data[0]*1000) + (data[1]*10) + (data[2]); + printf("read LCD_ID success, data[0]=%d, data[1]=%d, data[2]=%d, data[3]=%d, iVoltage=%d\n", + data[0], data[1], data[2], data[3], iVoltage); + if( LCM_MIN_VOLTAGE < iVoltage && + iVoltage < LCM_MAX_VOLTAGE) + return 1; + else + return 0; + } + return 0; +} +#endif + +static unsigned int lcm_compare_id(void) +{ + int array[4]; + char buffer[3]; + char id0=0; + char id1=0; + char id2=0; + + lcm_reset();//must be ahead of this function. + +#if defined BUILD_UBOOT + if(lcm_adc_read_chip_id()) + return 1; +#endif + + array[0] = 0x00083700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + + read_reg_v2(0x04,buffer, 3); + + id0 = buffer[0]; //should be 0x00 + id1 = buffer[1];//should be 0x80 + id2 = buffer[2];//should be 0x00 +#ifdef BUILD_UBOOT + printf("%s, id0 = 0x%08x\n", __func__, id0);//should be 0x00 + printf("%s, id1 = 0x%08x\n", __func__, id1);//should be 0xaa + printf("%s, id2 = 0x%08x\n", __func__, id2);//should be 0x55 +#endif + + return 0; +} + + +LCM_DRIVER nt35516_dsi_ips_lcm_drv = +{ + .name = "nt35516_dsi_ips", + .set_util_funcs = lcm_set_util_funcs, + .compare_id = lcm_compare_id, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if defined(LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif +#ifndef BUILD_UBOOT + .get_initialization_settings = get_initialization_settings, + .set_initialization_settings = set_initialization_settings, +#endif + }; diff --git a/cink_peax_tinnoes77_s9091/lcm/nt35516_qhd_dsi_cmd_tft9k1342/nt35516_qhd_dsi_cmd_tft9k1342.c b/cink_peax_tinnoes77_s9091/lcm/nt35516_qhd_dsi_cmd_tft9k1342/nt35516_qhd_dsi_cmd_tft9k1342.c new file mode 100644 index 0000000..d1fc676 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/nt35516_qhd_dsi_cmd_tft9k1342/nt35516_qhd_dsi_cmd_tft9k1342.c @@ -0,0 +1,466 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifndef BUILD_UBOOT +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0x00 // END OF REGISTERS MARKER + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +//#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + + +#define LCM_DSI_CMD_MODE + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0xff,4,{0xAA,0x55,0x25,0x01}}, + {0xf3,4,{0x02,0x03,0x07,0x15}}, + {0xF0,5,{0x55,0xAA,0x52,0x08,0x00}}, + {0xB8,4,{0x01,0x02,0x02,0x02}}, + {0xBC,3,{0x05,0x05,0x05}}, + {0xF0,5,{0x55,0xAA,0x52,0x08,0x01}}, + {0xB0,3,{0x05,0x05,0x05}}, + {0xB1,3,{0x05,0x05,0x05}}, + {0xB6,3,{0x44,0x44,0x44}}, + {0xB7,3,{0x34,0x34,0x34}}, + {0xB3,3,{0x10,0x10,0x10}}, + {0xB9,3,{0x34,0x34,0x34}}, + {0xB4,3,{0x0A,0x0A,0x0A}}, + {0xBA,3,{0x14,0x14,0x14}}, + {0xBC,3,{0x00,0xA0,0x00}}, + {0xBD,3,{0x00,0xA0,0x00}}, + {0xBE,1,{0x4E}}, + {0xD1,16,{0x00,0x32,0x00,0x41,0x00,0x54,0x00,0x67,0x00,0x7A,0x00,0x98,0x00,0xB0,0x00,0xDB}} , + {0xD2,16,{0x01,0x01,0x01,0x3F,0x01,0x70,0x01,0xB4,0x01,0xEC,0x01,0xED,0x02,0x1E,0x02,0x51}}, + {0xD3,16,{0x02,0x6C,0x02,0x8D,0x02,0xA5,0x02,0xC9,0x02,0xEA,0x03,0x19,0x03,0x45,0x03,0x7A}}, + {0xD4,4,{0x03,0xB0,0x03,0xF4}} , + {0xD5,16,{0x00,0x32,0x00,0x41,0x00,0x54,0x00,0x67,0x00,0x7A,0x00,0x98,0x00,0xB0,0x00,0xDB}} , + {0xD6,16,{0x01,0x01,0x01,0x3F,0x01,0x70,0x01,0xB4,0x01,0xEC,0x01,0xED,0x02,0x1E,0x02,0x51}}, + {0xD7,16,{0x02,0x6C,0x02,0x8D,0x02,0xA5,0x02,0xC9,0x02,0xEA,0x03,0x19,0x03,0x45,0x03,0x7A}} , + {0xD8,4,{0x03,0xB0,0x03,0xF4}} , + {0xD9,16,{0x00,0x32,0x00,0x41,0x00,0x54,0x00,0x67,0x00,0x7A,0x00,0x98,0x00,0xB0,0x00,0xDB}}, + {0xDD,16,{0x01,0x01,0x01,0x3F,0x01,0x70,0x01,0xB4,0x01,0xEC,0x01,0xED,0x02,0x1E,0x02,0x51}}, + {0xDE,16,{0x02,0x6C,0x02,0x8D,0x02,0xA5,0x02,0xC9,0x02,0xEA,0x03,0x19,0x03,0x45,0x03,0x7A}} , + {0xDF,4,{0x03,0xB0,0x03,0xF4}} , + {0xE0,16,{0x00,0x32,0x00,0x41,0x00,0x54,0x00,0x67,0x00,0x7A,0x00,0x98,0x00,0xB0,0x00,0xDB}}, + {0xE1,16,{0x01,0x01,0x01,0x3F,0x01,0x70,0x01,0xB4,0x01,0xEC,0x01,0xED,0x02,0x1E,0x02,0x51}} , + {0xE2,16,{0x02,0x6C,0x02,0x8D,0x02,0xA5,0x02,0xC9,0x02,0xEA,0x03,0x19,0x03,0x45,0x03,0x7A}} , + + {0xE3,4,{0x03,0xB0,0x03,0xF4}} , + {0xE4,16,{0x00,0x32,0x00,0x41,0x00,0x54,0x00,0x67,0x00,0x7A,0x00,0x98,0x00,0xB0,0x00,0xDB}}, + {0xE5,16,{0x01,0x01,0x01,0x3F,0x01,0x70,0x01,0xB4,0x01,0xEC,0x01,0xED,0x02,0x1E,0x02,0x51}}, + {0xEA,16,{0x02,0x6C,0x02,0x8D,0x02,0xA5,0x02,0xC9,0x02,0xEA,0x03,0x19,0x03,0x45,0x03,0x7A}} , + {0xEB,4,{0x03,0xB0,0x03,0xF4}} , + + {0x3A,1,{0x07}}, + {0x35,1,{0x00}}, + {0x55,1,{2}}, + {0x4C,1,{0x11}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 20, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 200, {}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; +static struct LCM_setting_table lcm_compare_id_setting[] = { + // Display off sequence + {0xF0, 5, {0x55, 0xaa, 0x52,0x08,0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + MDELAY(2); + } + } + +} + + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + + params->dsi.DSI_WMEM_CONTI=0x3C; + params->dsi.DSI_RMEM_CONTI=0x3E; + + + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.vertical_sync_active = 3; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 50; + params->dsi.horizontal_frontporch = 50; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + params->dsi.LPX =12; + + // Bit rate calculation + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(50); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_sleep_mode_in_setting, sizeof(lcm_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + //SET_RESET_PIN(0); + //MDELAY(1); + //SET_RESET_PIN(1); + unsigned int data_array[2]; +#if 1 + //data_array[0] = 0x00000504; // Display Off + //dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(100); + data_array[0] = 0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +#endif +#ifdef BUILD_UBOOT + printf("zhibin uboot %s\n", __func__); +#else + printk("zhibin kernel %s\n", __func__); +#endif + +} + + +static void lcm_resume(void) +{ + //lcm_init(); +#ifdef BUILD_UBOOT + printf("zhibin uboot %s\n", __func__); +#else + printk("zhibin kernel %s\n", __func__); + +#endif + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + +#ifdef BUILD_UBOOT + printf("zhibin uboot %s\n", __func__); +#else + printk("zhibin kernel %s\n", __func__); +#endif + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} +static unsigned int lcm_compare_id(void) +{ + + int array[4]; + char buffer[3]; + char id0=0; + char id1=0; + char id2=0; + + + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(200); + + array[0] = 0x00083700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + + read_reg_v2(0x04,buffer, 3); + + id0 = buffer[0]; //should be 0x00 + id1 = buffer[1];//should be 0x80 + id2 = buffer[2];//should be 0x00 + #ifdef BUILD_UBOOT + printf("zhibin uboot %s\n", __func__); + printf("%s, id0 = 0x%08x\n", __func__, id0);//should be 0x00 + printf("%s, id1 = 0x%08x\n", __func__, id1);//should be 0x80 + printf("%s, id2 = 0x%08x\n", __func__, id2);//should be 0x00 + #else + //printk("zhibin kernel %s\n", __func__); + #endif + + return 0; + + +} + + +LCM_DRIVER nt35516_dsi_tft_lcm_drv = +{ + .name = "nt35516_dsi_tf", + .set_util_funcs = lcm_set_util_funcs, + .compare_id = lcm_compare_id, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if defined(LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif + }; diff --git a/cink_peax_tinnoes77_s9091/lcm/nt35565_3D/nt35565_3d.c b/cink_peax_tinnoes77_s9091/lcm/nt35565_3D/nt35565_3d.c new file mode 100644 index 0000000..52f33a3 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/nt35565_3D/nt35565_3d.c @@ -0,0 +1,349 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + + {0x51, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x55, 1, {0x02}}, + {REGFLAG_DELAY, 1, {}}, + + {0x53, 1, {0x2C}}, + {REGFLAG_DELAY, 1, {}}, + + // ENABLE FMARK + {0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}}, + {REGFLAG_DELAY, 1, {}}, + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 1, {}}, + + {0x51, 1, {0xFF}}, + {REGFLAG_DELAY, 1, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +//static struct LCM_setting_table lcm_set_window[] = { +// {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, +// {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, +// {REGFLAG_END_OF_TABLE, 0x00, {}} +//}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + // LCM driver IC specifies 15ms needed after sleep out. But we need more delay time to make sure latest RAM data has been refreshed to screen. + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +//static struct LCM_setting_table lcm_backlight_level_setting[] = { +// {0x51, 1, {0xFF}}, +// {REGFLAG_END_OF_TABLE, 0x00, {}} +//}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=480*3; + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + // NT35565 accept maximum 510Mbps + params->dsi.pll_div1=38; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_suspend(void) +{ + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_resume(void) +{ + // Work around for Novatek driver IC. If it entered ULP mode, it must be reset before resume. + lcm_init(); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(data_array, 7, 0); + +} + + +//static void lcm_setbacklight(unsigned int level) +//{ + // Refresh value of backlight level. +// lcm_backlight_level_setting[0].para_list[0] = level; + +// push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +//} + + +//static void lcm_setpwm(unsigned int divider) +//{ + // TBD +//} + + +//static unsigned int lcm_getpwm(unsigned int divider) +//{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 +// unsigned int pwm_clk = 23706 / (1< + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +*/ +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/nt35582_mcu/nt35582_mcu.c b/cink_peax_tinnoes77_s9091/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..7efa37e --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,429 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; //note:this para is different between 6573 and 6575 + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.read_latency = 0; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free +// params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c b/cink_peax_tinnoes77_s9091/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c new file mode 100644 index 0000000..c663789 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c @@ -0,0 +1,380 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->io_select_mode = 1; //note:this para is different between 6573 and 6575 + + + params->dbi.port = 0; //DBI port must be 0 or 1 on mt6575, should not be 2 + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 4; + params->dbi.parallel.read_hold = 0; + params->dbi.parallel.read_latency = 18; + params->dbi.parallel.wait_period = 1; + params->dbi.parallel.cs_high_width = 0; //cycles of cs high level between each transfer + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_6575_lcm_drv = +{ + .name = "nt35582_mcu_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c b/cink_peax_tinnoes77_s9091/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c new file mode 100644 index 0000000..6fa917d --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c @@ -0,0 +1,393 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#if 0 +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#endif +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +/* +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) +*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} + +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +}*/ +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_div1 = 0x15; + params->dpi.mipi_pll_clk_div2 = 5; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB565; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + + params->dbi.serial.css = 2; + params->dbi.serial.csh = 2; + params->dbi.serial.rd_1st = 2; + params->dbi.serial.rd_2nd = 2; + params->dbi.serial.wr_1st = 2; + params->dbi.serial.wr_2nd = 2; + params->dbi.serial.sif_3wire = 0; + params->dbi.serial.sif_sdi = 0; + + params->dbi.serial.sif_1st_pol = 0; + params->dbi.serial.sif_sck_def = 0; + params->dbi.serial.sif_div2 = 0; + params->dbi.serial.sif_hw_cs = 1; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_6575_4MA; + params->dpi.i2x_en = 0; + params->dpi.i2x_edge = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); +// config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ +// config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ +// config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER nt35582_rgb_6575_lcm_drv = +{ + .name = "nt35582_rgb_6575", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/cink_peax_tinnoes77_s9091/lcm/otm9608_qhd_dsi_cmd/otm9608_qhd_dsi_cmd.c b/cink_peax_tinnoes77_s9091/lcm/otm9608_qhd_dsi_cmd/otm9608_qhd_dsi_cmd.c new file mode 100755 index 0000000..8c18e97 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/otm9608_qhd_dsi_cmd/otm9608_qhd_dsi_cmd.c @@ -0,0 +1,659 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#if defined(BUILD_UBOOT) + #include + #define LCM_PRINT printf + #ifndef KERN_INFO + #define KERN_INFO + #endif +#else +#include + #include + #define LCM_PRINT printk +#endif + +#if 0 +#define LCM_DBG(fmt, arg...) \ + LCM_PRINT("[OTM9608A] %s (line:%d) :" fmt "\r\n", __func__, __LINE__, ## arg) +#else +#define LCM_DBG(fmt, arg...) do {} while (0) +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) +#define LCM_DSI_CMD_MODE + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +static unsigned char lcm_initialization_setting[LCM_INIT_TABLE_SIZE_MAX] = { +/* cmd, count, params*/ + 0x00, 1, 0x00, + 0xFF, 3, 0x96,0x08,0x01, + 0x00, 1, 0x80, + 0xFF, 2, 0x96,0x08, + 0x00, 1, 0x00, + 0x00, 1, 0x80, + 0xD6, 1, 0x08, + 0x00, 1, 0x00, + + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0xD4, 30, 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + 0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40, + + 0x00, 1, 0x00, + + 0xD5, 30, 0X0,0X60,0X0,0X60,0X0,0X5F,0X0,0X5F,0X0,0X5E, + 0X0,0X5E,0X0,0X5D,0X0,0X5D,0X0,0X5D,0X0,0X5C, + 0X0,0X5C,0X0,0X5B,0X0,0X5B,0X0,0X5A,0X0,0X5A, + 0xD5, 30, 0X0,0X5A,0X0,0X5B,0X0,0X5C,0X0,0X5D,0X0,0X5D, + 0X0,0X5E,0X0,0X5F,0X0,0X60,0X0,0X61,0X0,0X62, + 0X0,0X63,0X0,0X63,0X0,0X64,0X0,0X65,0X0,0X66, + 0xD5, 30, 0X0,0X67,0X0,0X68,0X0,0X69,0X0,0X69,0X0,0X6A, + 0X0,0X6B,0X0,0X6C,0X0,0X6D,0X0,0X6E,0X0,0X6F, + 0X0,0X6F,0X0,0X70,0X0,0X71,0X0,0X72,0X0,0X73, + 0xD5, 30, 0X0,0X74,0X0,0X74,0X0,0X75,0X0,0X76,0X0,0X77, + 0X0,0X78,0X0,0X78,0X0,0X79,0X0,0X7A,0X0,0X7B, + 0X0,0X7C,0X0,0X7D,0X0,0X7D,0X0,0X7E,0X0,0X7F, + 0xD5, 30, 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0xD5, 30, 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0xD5, 30, 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0xD5, 30, 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0xD5, 30, 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F,0X0,0X7F, + 0xD5, 30, 0X0,0X7F,0X0,0X7F,0X0,0X7E,0X0,0X7D,0X0,0X7C, + 0X0,0X7B,0X0,0X7A,0X0,0X7A,0X0,0X79,0X0,0X78, + 0X0,0X77,0X0,0X76,0X0,0X76,0X0,0X75,0X0,0X74, + 0xD5, 30, 0X0,0X73,0X0,0X72,0X0,0X71,0X0,0X71,0X0,0X70, + 0X0,0X6F,0X0,0X6E,0X0,0X6D,0X0,0X6C,0X0,0X6C, + 0X0,0X6B,0X0,0X6A,0X0,0X69,0X0,0X68,0X0,0X67, + 0xD5, 30, 0X0,0X66,0X0,0X66,0X0,0X66,0X0,0X65,0X0,0X65, + 0X0,0X64,0X0,0X64,0X0,0X63,0X0,0X63,0X0,0X63, + 0X0,0X62,0X0,0X62,0X0,0X61,0X0,0X61,0X0,0X60, + + 0x00, 1, 0x00, + 0xA0, 1, 0x80, + 0x00, 1, 0x80, + 0xB3, 5, 0x00,0x00,0x00,0x21,0x00, + 0x00, 1, 0x92, + 0xB3, 1, 0x01, + 0x00, 1, 0xC0, + 0xB3, 1, 0x11, + 0x00, 1, 0x80, + 0xC0, 9, 0x00,0x48,0x00,0x06,0x06,0x00,0x48,0x10,0x10, + 0x00, 1, 0x92, + 0xC0, 4, 0x00,0x17,0x00,0x1A, + 0x00, 1, 0xA2, + 0xC0, 3, 0x01,0x10,0x00, + 0x00, 1, 0xB3, + 0xC0, 2, 0x00,0x50, + 0x00, 1, 0x88, + 0xC4, 1, 0x40, + 0x00, 1, 0x81, + 0xC1, 1, 0x55,/*Frame rate 55h--60Hz, 33h--50Hz*/ + 0x00, 1, 0x80, + 0xC4, 3, 0x00,0x84,0xFA, + 0x00, 1, 0xA0, + 0xC4, 8, 0x33,0x09,0x90,0x2B,0x33,0x09,0x90,0x54, + 0x00, 1, 0x80, + 0xC5, 4, 0x08,0x00,0x90,0x11, + 0x00, 1, 0x90, + 0xC5, 7, 0x96,0x76,0x06,0x76,0x33,0x33,0x34, + 0x00, 1, 0xA0, + 0xC5, 7, 0x96,0x77,0x00,0x72,0x33,0x33,0x34, + 0x00, 1, 0xB0, + 0xC5, 2, 0x04,0xF8, + 0x00, 1, 0x80, + 0xC6, 1, 0x64, + 0x00, 1, 0xB0, + 0xC6, 5, 0x03,0x10,0x00,0x1F,0x12, + 0x00, 1, 0xE1, + 0xC0, 1, 0x9F, + 0x00, 1, 0x00, + 0xD0, 1, 0x01, + 0x00, 1, 0x00, + 0xD1, 2, 0x01,0x01, + 0x00, 1, 0xB7, + 0xB0, 1, 0x10, + 0x00, 1, 0xC0, + 0xB0, 1, 0x55, + 0x00, 1, 0xB1, + 0xB0, 2, 0x03,0x06, + 0x00, 1, 0x80, + 0xCB, 10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, 1, 0x90, + 0xCB, 15, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, 1, 0xA0, + 0xCB, 15, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, 1, 0xB0, + 0xCB, 10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, 1, 0xC0, + 0xCB, 15, 0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, 1, 0xD0, + 0xCB, 15, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00, + 0x00, 1, 0xE0, + 0xCB, 10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, 1, 0xF0, + 0xCB, 10, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0x00, 1, 0x80, + 0xCC, 10, 0x00,0x00,0x0B,0x09,0x01,0x25,0x26,0x00,0x00,0x00, + 0x00, 1, 0x90, + 0xCC, 15, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0A,0x02, + 0x00, 1, 0xA0, + 0xCC, 15, 0x25,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, 1, 0xB0, + 0xCC, 10, 0x00,0x00,0x0A,0x0C,0x02,0x26,0x25,0x00,0x00,0x00, + 0x00, 1, 0xC0, + 0xCC, 15, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0B,0x01, + 0x00, 1, 0xD0, + 0xCC, 15, 0x26,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00, 1, 0x80, + 0xCE, 12, 0x86,0x01,0x00,0x85,0x01,0x00,0x02,0x00,0x00,0x0F,0x00,0x00, + 0x00, 1, 0x90, + 0xCE, 14, 0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00,0x00, + 0x00, 1, 0xA0, + 0xCE, 14, 0x18,0x02,0x03,0xC4,0x00,0x80,0x14,0x18,0x01,0x03,0xC4,0x00,0x80,0x14, + 0x00, 1, 0xB0, + 0xCE, 14, 0x18,0x04,0x03,0xC2,0x00,0x80,0x14,0x18,0x03,0x03,0xC2,0x00,0x80,0x14, + 0x00, 1, 0xC0, + 0xCE, 14, 0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00, 1, 0xD0, + 0xCE, 14, 0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00, + + 0x00, 1, 0x80, + 0xCF, 14, 0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00, 1, 0x90, + 0xCF, 14, 0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00, 1, 0xA0, + 0xCF, 14, 0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00, 1, 0xB0, + 0xCF, 14, 0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00, 1, 0xC0, + 0xCF, 10, 0x02,0x02,0x20,0x20,0x00,0x00,0x01,0x00,0x10,0x00, + 0x00, 1, 0x00, + 0xD7, 1, 0x00, + 0x00, 1, 0x00, + 0xD8, 2, 0x89,0x89, + 0x00, 1, 0x00, + 0xD9, 1, 0x60, + 0x00, 1, 0x00, + 0xE1, 8, 0X0,0X4,0X8,0XB,0X4,0XC,0XB,0XA, + 0xE1, 8, 0X3,0X6,0XD,0X4,0X9,0X13,0XA,0X2, + 0x00, 1, 0x00, + 0xE1, 8, 0X0,0X4,0X8,0XB,0X4,0XC,0XB,0XA, + 0xE1, 8, 0X3,0X6,0XD,0X4,0X9,0X13,0XA,0X2, + + 0x00, 1, 0x00, + 0xFF, 3, 0xFF,0xFF,0xFF, + + 0x00, 1, 0x00, + 0x3A, 1, 0x77, + 0x00, 1, 0x00, +//0x36, 1, 0xD0, /*LCM layout rotate 180 degree on PCB*/ + 0x35, 1, 0x00,/*TE ON, mode=0*/ + 0x44, 2, 0x01, 0xE0,/* TE start line = 960/2 */ + + 0x36, 1, 0x00, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + REGFLAG_DELAY, 1, + + // Setting ending by predefined flag + REGFLAG_END_OF_TABLE +}; + +static unsigned char lcm_sleep_out_setting[] = { + // Sleep Out + 0x11, 0, + REGFLAG_DELAY, 120, + + // Display ON + 0x29, 0, + REGFLAG_DELAY, 20, + + REGFLAG_END_OF_TABLE +}; + +static unsigned char lcm_sleep_mode_in_setting[] = { + // Display off sequence + 0x28, 0, + REGFLAG_DELAY, 100, + + // Sleep Mode On + 0x10, 0, + REGFLAG_DELAY, 200, + REGFLAG_END_OF_TABLE +}; + +static unsigned char lcm_compare_id_setting[] = { + // Display off sequence + 0xF0, 5, 0x55, 0xaa, 0x52,0x08,0x00, + + REGFLAG_DELAY, 10, + + REGFLAG_END_OF_TABLE +}; + +static int push_table(unsigned char table[]) +{ + unsigned int i, bExit = 0; + unsigned char *p = (unsigned char *)table; + LCM_SETTING_ITEM *pSetting_item; + + while(!bExit) { + pSetting_item = (LCM_SETTING_ITEM *)p; + + switch (pSetting_item->cmd) { + + case REGFLAG_DELAY : + MDELAY(pSetting_item->count); + p += 2; + break; + + case REGFLAG_END_OF_TABLE : + p += 2; + bExit = 1; + break; + + default: + dsi_set_cmdq_V2(pSetting_item->cmd, + pSetting_item->count, pSetting_item->params, 1); + MDELAY(2); + p += pSetting_item->count + 2; + break; + } + } + return p - table; //return the size of settings array. +} + +#ifndef BUILD_UBOOT +static int get_initialization_settings(unsigned char table[]) +{ + memcpy(table, lcm_initialization_setting, sizeof(lcm_initialization_setting)); + return sizeof(lcm_initialization_setting); +} + +static void lcm_init(void); +static void lcm_reset(void); + +static int set_initialization_settings(const unsigned char table[], const int count) +{ + if ( count > LCM_INIT_TABLE_SIZE_MAX ){ + return -EIO; + } + memset(lcm_initialization_setting, REGFLAG_END_OF_TABLE, sizeof(lcm_initialization_setting)); + memcpy(lcm_initialization_setting, table, count); + + lcm_reset(); + lcm_init(); + push_table(lcm_sleep_out_setting); + + return count; +} +#endif +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + + params->dsi.DSI_WMEM_CONTI=0x3C; + params->dsi.DSI_RMEM_CONTI=0x3E; + + + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 2; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.vertical_sync_active = 3; + params->dsi.vertical_backporch = 6; + params->dsi.vertical_frontporch = 6; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 10; + params->dsi.horizontal_backporch = 20; + params->dsi.horizontal_frontporch = 40; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=20; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=0; // div2=0~15: fout=fvo/(2*div2) + params->dsi.LPX = 13; //read =7-12, write=13 + +} + +static void lcm_reset(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(128); +} + +static void lcm_init(void) +{ + LCM_DBG(); + push_table(lcm_initialization_setting); +} + +static void lcm_suspend(void) +{ + unsigned int data_array[2]; + LCM_DBG(); + + data_array[0] = 0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +} + +static void lcm_resume(void) +{ + LCM_DBG(); +#ifdef BUILD_UBOOT + lcm_reset(); + lcm_init(); +#endif + push_table(lcm_sleep_out_setting); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + +#if defined BUILD_UBOOT +#include "cust_adc.h" +#define LCM_MAX_VOLTAGE 1600 +#define LCM_MIN_VOLTAGE 1200 + +extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata); + +static unsigned int lcm_adc_read_chip_id() +{ + int data[4] = {0, 0, 0, 0}; + int tmp = 0, rc = 0, iVoltage = 0; + rc = IMM_GetOneChannelValue(AUXADC_LCD_ID_CHANNEL, data, &tmp); + if(rc < 0) { + printf("read LCD_ID vol error--Liu\n"); + return 0; + } + else { + iVoltage = (data[0]*1000) + (data[1]*10) + (data[2]); + printf("read LCD_ID success, data[0]=%d, data[1]=%d, data[2]=%d, data[3]=%d, iVoltage=%d\n", + data[0], data[1], data[2], data[3], iVoltage); + if( LCM_MIN_VOLTAGE < iVoltage && + iVoltage < LCM_MAX_VOLTAGE) + return 1; + else + return 0; + } + return 0; +} +#endif + +static unsigned int lcm_compare_id(void) +{ + + int array[4]; + char buffer[3]; + char id0=0; + char id1=0; + char id2=0; + + + lcm_reset();//must be ahead of this function. + +#if defined BUILD_UBOOT + if(lcm_adc_read_chip_id()) + return 1; +#endif + + array[0] = 0x00033700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + + read_reg_v2(0xDA,buffer, 1); + + + array[0] = 0x00033700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + read_reg_v2(0xDB,buffer+1, 1); + + + array[0] = 0x00033700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + read_reg_v2(0xDC,buffer+2, 1); + + id0 = buffer[0]; //should be 0x00 + id1 = buffer[1];//should be 0xaa + id2 = buffer[2];//should be 0x55 +#ifdef BUILD_UBOOT + printf("%s, id0 = 0x%08x\n", __func__, id0);//should be 0x00 + printf("%s, id1 = 0x%08x\n", __func__, id1);//should be 0xaa + printf("%s, id2 = 0x%08x\n", __func__, id2);//should be 0x55 +#endif + + return 1; +} + +LCM_DRIVER otm9608a_dsi_lcm_drv = +{ + .name = "otm9608a_dsi", + .set_util_funcs = lcm_set_util_funcs, + .compare_id = lcm_compare_id, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if defined(LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif +#ifndef BUILD_UBOOT + .get_initialization_settings = get_initialization_settings, + .set_initialization_settings = set_initialization_settings, +#endif + }; diff --git a/cink_peax_tinnoes77_s9091/lcm/r61408/r61408.c b/cink_peax_tinnoes77_s9091/lcm/r61408/r61408.c new file mode 100644 index 0000000..fb40c12 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/r61408/r61408.c @@ -0,0 +1,334 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x1408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; +#if defined(LCM_DSI_CMD_MODE) + data_array[0] = 0x04B02300;//B0 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + data_array[0] = 0x00032902;//MIPI DSI Control + data_array[1] = 0x008352B6; //B6 + dsi_set_cmdq(&data_array, 2, 1); + + data_array[0] = 0x00152902;//BLC + data_array[1] = 0x090900B8; //B8 + data_array[2] = 0xe6e6ffff; + data_array[3] = 0x10101802; + data_array[4] = 0xbe875a37; + data_array[5] = 0x000000ff; + data_array[6] = 0x00000000; + dsi_set_cmdq(&data_array, 7, 1); + MDELAY(50); + + data_array[0] = 0x00052902; + data_array[1] = 0x02ff00B9; //B9 + data_array[2] = 0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + + data_array[0] = 0x00102902; // panel driving setting 2 + data_array[1] = 0x003143C1; //C1 + data_array[2] = 0x12322626; + data_array[3] = 0xA50a4a28; + data_array[4] = 0x0121580F; + dsi_set_cmdq(&data_array, 5, 1); + + data_array[0] = 0x28d62300;//D6 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00053902; + data_array[1] = 0x0100002A;//2A + data_array[2] = 0x000000DF; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(50); + + data_array[0] = 0x00053902; + data_array[1] = 0x0300002B;//2B + data_array[2] = 0x0000001f; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(50); + + data_array[0] = 0x00361500;//36 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x00351500;//36 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x773A1500;//3A + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(50); + + data_array[0] = 0x00110500;//11 + dsi_set_cmdq(&data_array, 1, 1); + + MDELAY(125); + + data_array[0] = 0x00290500;//29 + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(125); +#endif +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; +// params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=30; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + +static void lcm_init(void) +{ + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ZERO); + MDELAY(25); + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ONE); + MDELAY(50); + + init_lcm_registers(); + MDELAY(500); +// clear_panel(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; +// data_array[6]= 0x002c3901; + + dsi_set_cmdq(data_array, 7, 0); + +} + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int data_array[16]; + data_array[0] = 0x00052902; + data_array[1] = 0x020000B9 | (level << 16); //B9 + data_array[2] = 0x00000008; + dsi_set_cmdq(data_array, 3, 1); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + unsigned char buffer[5]; + unsigned int array[16]; + //NOTE:should reset LCM firstly + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ZERO); + MDELAY(25); + lcm_util.set_gpio_out(GPIO_DISP_LRSTB_PIN, GPIO_OUT_ONE); + MDELAY(50); + + array[0] = 0x00053700;// read id return 5 byte + dsi_set_cmdq(array, 1, 1); + + array[0] = 0x04B02300;// unlock for reading ID + dsi_set_cmdq(array, 1, 1); + MDELAY(50); + + read_reg_v2(0xBF, buffer, 5); + id = (buffer[2] << 8) | buffer[3]; //we only need ID +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%x\n", __func__, id); +#endif + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER r61408_lcm_drv = +{ + .name = "r61408", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .compare_id = lcm_compare_id +}; + diff --git a/cink_peax_tinnoes77_s9091/lcm/r63303_idisplay/r63303_idisplay.c b/cink_peax_tinnoes77_s9091/lcm/r63303_idisplay/r63303_idisplay.c new file mode 100644 index 0000000..70444ad --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/r63303_idisplay/r63303_idisplay.c @@ -0,0 +1,490 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#if defined(BUILD_UBOOT) +#include +#else +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (640) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#define LCM_DSI_CMD_MODE 0 + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + + {0xB2, 1, {0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB7, 4, {0x01, 0x00, 0x05, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + {0xC4, 6, {0xDF, 0x01, 0x1C, 0x0C, + 0x00, 0x42}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCA, 8, {0x01, 0x80, 0x01, 0x01, + 0x7B, 0x33, 0x03, 0x03}}, + {REGFLAG_DELAY, 10, {}}, + + {0xCB, 7, {0x00, 0x00, 0x03, 0x20, + 0x03, 0x00, 0x00}}, + {REGFLAG_DELAY, 10, {}}, + + //{0xB2, 1, {0x03}}, + //{REGFLAG_DELAY, 10, {}}, + + // Note + // Strongly recommend not to set Sleep out / Display On here. That will cause messed frame to be shown as later the backlight is on. + + + // Setting ending by predefined flag + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + // Sleep Out + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 120, {}}, + + // Display ON + {0x29, 1, {0x00}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + +#if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_PULSE_VDO_MODE; +#endif + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 3; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active = 16; + params->dsi.vertical_backporch = 12; + params->dsi.vertical_frontporch = 12; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 16; + params->dsi.horizontal_backporch = 14; + params->dsi.horizontal_frontporch = 14; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + + /* ESD or noise interference recovery For video mode LCM only. */ + // Send TE packet to LCM in a period of n frames and check the response. + params->dsi.lcm_int_te_monitor = FALSE; + params->dsi.lcm_int_te_period = 1; // Unit : frames + + // Need longer FP for more opportunity to do int. TE monitor applicably. + if(params->dsi.lcm_int_te_monitor) + params->dsi.vertical_frontporch *= 2; + + // Monitor external TE (or named VSYNC) from LCM once per 2 sec. (LCM VSYNC must be wired to baseband TE pin.) + params->dsi.lcm_ext_te_monitor = FALSE; + // Non-continuous clock + params->dsi.noncont_clock = TRUE; + params->dsi.noncont_clock_period = 2; // Unit : frames + +} + +#define GPIO_PIN_1V8 21 +#define GPIO_PIN_5V7 19 + +extern void DSI_clk_HS_mode(bool enter); +static unsigned int is_init = false; + +static void lcm_init(void) +{ + unsigned char buffer[5]; + unsigned int data_array[16]; + + DSI_clk_HS_mode(0); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ZERO); + + mt_set_gpio_mode(GPIO_PIN_5V7, GPIO_MODE_GPIO); + mt_set_gpio_mode(GPIO_PIN_1V8, GPIO_MODE_GPIO); + SET_RESET_PIN(0); + + mt_set_gpio_dir(GPIO_PIN_5V7, GPIO_DIR_OUT); + mt_set_gpio_dir(GPIO_PIN_1V8, GPIO_DIR_OUT); + + MDELAY(100); + + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ONE); + MDELAY(100); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ONE); + MDELAY(100); + + // SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(100); + + // Enable high speed clock + DSI_clk_HS_mode(1); + MDELAY(10); + + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + + data_array[0] = 0x00043700; + dsi_set_cmdq(data_array, 1, 1); + read_reg_v2(0xB7, buffer, 4); + + is_init = true; + +} + + +static void lcm_suspend(void) +{ + //push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + + mt_set_gpio_out(GPIO_PIN_5V7, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_PIN_1V8, GPIO_OUT_ZERO); + + is_init = false; +} + + +static void lcm_resume(void) +{ + if (!is_init) + lcm_init(); + + //push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + +} + + +static void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 145; + unsigned int mapped_level = 0; + + //for LGE backlight IC mapping table + if(level > 255) + level = 255; + + if(level >0) + mapped_level = default_level+(level)*(255-default_level)/(255); + else + mapped_level=0; + + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = mapped_level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/spfd5461a/spfd5461a.c b/cink_peax_tinnoes77_s9091/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..fef627b --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,385 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/ta7601/ta7601.c b/cink_peax_tinnoes77_s9091/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..46ac606 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/ta7601/ta7601.c @@ -0,0 +1,318 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/tft1p3037/tft1p3037.c b/cink_peax_tinnoes77_s9091/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..15ced13 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,349 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_peax_tinnoes77_s9091/lcm/truly_s9050_dpi/truly_s9050_dpi.c b/cink_peax_tinnoes77_s9091/lcm/truly_s9050_dpi/truly_s9050_dpi.c new file mode 100755 index 0000000..16251a7 --- /dev/null +++ b/cink_peax_tinnoes77_s9091/lcm/truly_s9050_dpi/truly_s9050_dpi.c @@ -0,0 +1,250 @@ + +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#include +#include +#endif +#include "lcm_drv.h" + +static int lcdc_debug_mask = 1; + +#ifdef BUILD_UBOOT +#define lcdc_debug(format,...) \ + do { \ + if (lcdc_debug_mask) \ + printf(format,__VA_ARGS__); \ + } while (0) +#else +#define lcdc_debug(format,...) \ + do { \ + if (lcdc_debug_mask) \ + printk(format,__VA_ARGS__); \ + } while (0) +#endif + + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (480) + +#define BACKLIGHT_ENABLE_PIN GPIO68 +#define LCM_RESET_PIN GPIO18 + +static int power_on = 0; + +static int lcm_config_rgb() +{ + //red + mt_set_gpio_mode(GPIO26, GPIO_MODE_01); + mt_set_gpio_mode(GPIO32, GPIO_MODE_01); + mt_set_gpio_mode(GPIO22, GPIO_MODE_01); + mt_set_gpio_mode(GPIO27, GPIO_MODE_01); + mt_set_gpio_mode(GPIO40, GPIO_MODE_01); + + //green + mt_set_gpio_mode(GPIO34, GPIO_MODE_01); + mt_set_gpio_mode(GPIO38, GPIO_MODE_01); + mt_set_gpio_mode(GPIO46, GPIO_MODE_01); + mt_set_gpio_mode(GPIO39, GPIO_MODE_01); + mt_set_gpio_mode(GPIO28, GPIO_MODE_01); + mt_set_gpio_mode(GPIO33, GPIO_MODE_01); + + //blue + mt_set_gpio_mode(GPIO42, GPIO_MODE_01); + mt_set_gpio_mode(GPIO20, GPIO_MODE_01); + mt_set_gpio_mode(GPIO24, GPIO_MODE_01); + mt_set_gpio_mode(GPIO29, GPIO_MODE_01); + mt_set_gpio_mode(GPIO31, GPIO_MODE_01); + + //DPIDE + mt_set_gpio_mode(GPIO30, GPIO_MODE_01); + + //DPICK + mt_set_gpio_mode(GPIO41, GPIO_MODE_01); + + //DPIVSYNC + mt_set_gpio_mode(GPIO21, GPIO_MODE_01); + + //DPIHSYNC + mt_set_gpio_mode(GPIO19, GPIO_MODE_01); + +} + +static int lcm_backlight_power(int on) +{ + if(on) { + mt_set_gpio_mode(BACKLIGHT_ENABLE_PIN, GPIO_MODE_GPIO); + mt_set_gpio_dir(BACKLIGHT_ENABLE_PIN, GPIO_DIR_OUT); + #ifdef BUILD_UBOOT + mt_set_gpio_out(BACKLIGHT_ENABLE_PIN, 1); + #endif + } + else { + mt_set_gpio_mode(BACKLIGHT_ENABLE_PIN, GPIO_MODE_GPIO); + mt_set_gpio_dir(BACKLIGHT_ENABLE_PIN, GPIO_DIR_OUT); + #ifdef BUILD_UBOOT + mt_set_gpio_out(BACKLIGHT_ENABLE_PIN, 0); + #endif + } + return 0; +} + +static int lcm_power(int on) +{ + if(on) { + #ifdef BUILD_UBOOT + pmic_config_interface(0xAF, 0x2, 0x7, 0x4); + pmic_config_interface(0xAF, 0x1, 0x1, 0); + #else + hwPowerOn(MT65XX_POWER_LDO_VGP, VOL_1800, "lcm"); + #endif + } + else { + #ifdef BUILD_UBOOT + pmic_config_interface(0xAF, 0, 0x1, 0); + #else + hwPowerDown(MT65XX_POWER_LDO_VGP, "lcm"); + #endif + } + return 0; +} + +static int lcm_reset(void) +{ + mt_set_gpio_mode(LCM_RESET_PIN, GPIO_MODE_GPIO); + mt_set_gpio_dir(LCM_RESET_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(LCM_RESET_PIN, 1); + mdelay(1); + mt_set_gpio_out(LCM_RESET_PIN, 0); + mdelay(1); + mt_set_gpio_out(LCM_RESET_PIN, 1); + return 0; +} + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + lcdc_debug("%s: --Liu\n", __func__); + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + lcdc_debug("%s: --Liu\n", __func__); + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; //? + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* RGB interface configurations */ + //the most important parameters: set pll clk to 66Mhz and dpi clk to 33Mhz + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 31; + params->dpi.mipi_pll_clk_div2 = 4; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + params->dpi.clk_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pulse_width = 48; + params->dpi.hsync_back_porch = 40; + params->dpi.hsync_front_porch = 40; + params->dpi.vsync_pulse_width = 1; + params->dpi.vsync_back_porch = 31; + params->dpi.vsync_front_porch = 13; + params->dpi.format = LCM_DPI_FORMAT_RGB565; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + params->dpi.intermediat_buffer_num = 2; + //LCM_DRIVING_CURRENT_8MA | LCM_DRIVING_CURRENT_4MA | LCM_DRIVING_CURRENT_2MA; + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + +static void lcm_init(void) +{ + lcdc_debug("%s: --Liu\n", __func__); + lcm_config_rgb(); +#ifdef BUILD_UBOOT + lcm_power(1); +#else + //hwPowerOn(MT65XX_POWER_LDO_VGP, VOL_1800, "bl"); +#endif +} + +static void lcm_suspend(void) +{ + lcdc_debug("%s: --Liu\n", __func__); + lcm_backlight_power(0); + lcm_power(0); + +} + +static void lcm_resume(void) +{ + lcdc_debug("%s: --Liu\n", __func__); + lcm_config_rgb(); + lcm_power(1); + lcm_reset(); + lcm_backlight_power(1); + +} + +int lcm_power_test(int on) +{ + lcm_config_rgb(); + if(on){ + lcm_power(1); + lcm_reset(); + lcm_backlight_power(1); + } + else{ + lcm_backlight_power(0); + lcm_power(0); + } +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + //lcdc_debug("%s: --Liu\n", __func__); + if(!power_on) { + lcm_power(1); + lcm_reset(); + lcm_backlight_power(1); + power_on = 1; + } +} + +static void lcm_setbacklight(unsigned int level) +{ + lcdc_debug("%s: --Liu\n", __func__); +} + +static unsigned int lcm_compare_id(void) +{ + lcdc_debug("%s: --Liu\n", __func__); + return 0; +} + +LCM_DRIVER lcdc_s9050_lcm_drv = +{ + .name = "lcdc_s9050", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, + .set_backlight = lcm_setbacklight, + .set_pwm = NULL, + .get_pwm = NULL, + .esd_check = NULL, + .esd_recover = NULL +}; + diff --git a/cink_slim_s8073/lcm/bm8578/bm8578.c b/cink_slim_s8073/lcm/bm8578/bm8578.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/dummy/dummy.c b/cink_slim_s8073/lcm/dummy/dummy.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/ha5266/ha5266.c b/cink_slim_s8073/lcm/ha5266/ha5266.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hsd070idw1/hsd070idw1.c b/cink_slim_s8073/lcm/hsd070idw1/hsd070idw1.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8357B/hx8357b.c b/cink_slim_s8073/lcm/hx8357B/hx8357b.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c b/cink_slim_s8073/lcm/hx8363_6575_dsi/hx8363_6575_dsi.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8363_6575_dsi_hvga/hx8363_6575_dsi_hvga.c b/cink_slim_s8073/lcm/hx8363_6575_dsi_hvga/hx8363_6575_dsi_hvga.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369/hx8369.c b/cink_slim_s8073/lcm/hx8369/hx8369.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369_6575/hx8369_6575.c b/cink_slim_s8073/lcm/hx8369_6575/hx8369_6575.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c b/cink_slim_s8073/lcm/hx8369_6575_dsi/hx8369_6575_dsi.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c b/cink_slim_s8073/lcm/hx8369_6575_dsi_hvga/hx8369_6575_dsi_hvga.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369_6575_dsi_qvga/hx8369_6575_dsi_qvga.c b/cink_slim_s8073/lcm/hx8369_6575_dsi_qvga/hx8369_6575_dsi_qvga.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369_dsi/hx8369_dsi.c b/cink_slim_s8073/lcm/hx8369_dsi/hx8369_dsi.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369_dsi_vdo/hx8369_dsi_vdo.c b/cink_slim_s8073/lcm/hx8369_dsi_vdo/hx8369_dsi_vdo.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369_hvga/hx8369_hvga.c b/cink_slim_s8073/lcm/hx8369_hvga/hx8369_hvga.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/hx8369b_dsi_vdo/hx8369b_dsi_vdo.c b/cink_slim_s8073/lcm/hx8369b_dsi_vdo/hx8369b_dsi_vdo.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/ili9481/ili9481.c b/cink_slim_s8073/lcm/ili9481/ili9481.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/inc/lcm_drv.h b/cink_slim_s8073/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/lg4571/lg4571.c b/cink_slim_s8073/lcm/lg4571/lg4571.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/lt4015w_dsi/lt4015w_dsi.c b/cink_slim_s8073/lcm/lt4015w_dsi/lt4015w_dsi.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/lt4015w_thai_dsi/lt4015w_thai_dsi.c b/cink_slim_s8073/lcm/lt4015w_thai_dsi/lt4015w_thai_dsi.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/lt5002f_dsi/lt5002f_dsi.c b/cink_slim_s8073/lcm/lt5002f_dsi/lt5002f_dsi.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c b/cink_slim_s8073/lcm/lvds_wsvga_ti/lvds_wsvga_ti.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c b/cink_slim_s8073/lcm/lvds_wsvga_ti_n/lvds_wsvga_ti_n.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/mt65xx_lcm_list.c b/cink_slim_s8073/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/mtk_cust.mk b/cink_slim_s8073/lcm/mtk_cust.mk new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35510/nt35510.c b/cink_slim_s8073/lcm/nt35510/nt35510.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35510_6517/nt35510_6517.c b/cink_slim_s8073/lcm/nt35510_6517/nt35510_6517.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35510_dsi/nt35510_dsi.c b/cink_slim_s8073/lcm/nt35510_dsi/nt35510_dsi.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35510_hvga/nt35510_hvga.c b/cink_slim_s8073/lcm/nt35510_hvga/nt35510_hvga.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35510_qvga/nt35510_qvga.c b/cink_slim_s8073/lcm/nt35510_qvga/nt35510_qvga.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35565_3D/nt35565_3d.c b/cink_slim_s8073/lcm/nt35565_3D/nt35565_3d.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35582/nt35582.c b/cink_slim_s8073/lcm/nt35582/nt35582.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35582_mcu/nt35582_mcu.c b/cink_slim_s8073/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c b/cink_slim_s8073/lcm/nt35582_mcu_6575/nt35582_mcu_6575.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c b/cink_slim_s8073/lcm/nt35582_rgb_6575/nt35582_rgb_6575.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/r61408/r61408.c b/cink_slim_s8073/lcm/r61408/r61408.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/r63303_idisplay/r63303_idisplay.c b/cink_slim_s8073/lcm/r63303_idisplay/r63303_idisplay.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/s6d0170/s6d0170.c b/cink_slim_s8073/lcm/s6d0170/s6d0170.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/spfd5461a/spfd5461a.c b/cink_slim_s8073/lcm/spfd5461a/spfd5461a.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/ta7601/ta7601.c b/cink_slim_s8073/lcm/ta7601/ta7601.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_slim_s8073/lcm/tft1p3037/tft1p3037.c b/cink_slim_s8073/lcm/tft1p3037/tft1p3037.c new file mode 100644 index 0000000..e69de29 diff --git a/cink_tinnoes73_gb/lcm/bm8578/bm8578.c b/cink_tinnoes73_gb/lcm/bm8578/bm8578.c new file mode 100755 index 0000000..6b8c0cb --- /dev/null +++ b/cink_tinnoes73_gb/lcm/bm8578/bm8578.c @@ -0,0 +1,269 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (400) +#define LCM_ID (0x52) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + set_lcm_register(0x83, 0x02); // TESTTM=1 + set_lcm_register(0x85, 0x03); // VDC_SEL=011 + set_lcm_register(0x8c, 0x93); + set_lcm_register(0x91, 0x01); // pre:0x01 + set_lcm_register(0x83, 0x00); + + // Gamma Setting + set_lcm_register(0x3E, 0xB0); + set_lcm_register(0x3F, 0x03); + set_lcm_register(0x40, 0x10); + set_lcm_register(0x41, 0x56); + set_lcm_register(0x42, 0x13); + set_lcm_register(0x43, 0x46); + set_lcm_register(0x44, 0x23); + set_lcm_register(0x45, 0x76); + set_lcm_register(0x46, 0x00); + set_lcm_register(0x47, 0x5e); + set_lcm_register(0x48, 0x4f); + set_lcm_register(0x49, 0x40); + + // Power Supply Setting + set_lcm_register(0x17, 0x91); // RADJ = 1010(7.5MHz x 100%), OSC_EN = 1 + set_lcm_register(0x23, 0x01); // TE ON, new added + set_lcm_register(0x2B, 0xF9); // N_DCDC = 0xF9 + MDELAY(10); + + set_lcm_register(0x1B, 0x16); // BT = 0001, AP = 100 + set_lcm_register(0x1A, 0x11); // VC3 = 001, VC1 = 001 + set_lcm_register(0x1C, 0x0D); // VRH = 1101 + set_lcm_register(0x1F, 0x42); // VCM = 100_0010 + MDELAY(20); + + set_lcm_register(0x19, 0x0A); // GASENB=0,PON=0,DK=1,XDK=0,VLCD_TRI=1,STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0,PON=1,DK=1,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0,PON=1,DK=0,XDK=0,VLCD_TRI=1,STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1,VDV=0_1100 + MDELAY(100); + set_lcm_register(0x3C, 0x60); + set_lcm_register(0x3D, 0x40); + set_lcm_register(0x34, 0x38); + set_lcm_register(0x35, 0x38); + set_lcm_register(0x24, 0x38); + MDELAY(40); + set_lcm_register(0x24, 0x3C); + set_lcm_register(0x16, 0x08); // pre:C8 + set_lcm_register(0x01, 0x02); + set_lcm_register(0x55, 0x00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_OR_HSYNC; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 50; + params->dbi.te_vs_width_cnt = 277; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(250); + + init_lcm_registers(); + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x28); // PT=00,GON=1, DTE=1, D=11 + MDELAY(40); + set_lcm_register(0x24, 0x20); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x3C, 0x00); // N_SAP=0000 0000 + set_lcm_register(0x1B, 0x10); // BT=0001, AP=000 + set_lcm_register(0x19, 0x0A); // PON=0, DK=1 + set_lcm_register(0x1E, 0x00); // VCOMG=1, + set_lcm_register(0x19, 0x01); // STB=1 + set_lcm_register(0x17, 0x00); // OSC_EN=0 +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x17, 0x91); // RADJ=1010(7.5MHz x 100%), OSC_EN=1 + set_lcm_register(0x2B, 0xF9); // N_DCDC=0xF9. + MDELAY(10); + set_lcm_register(0x1B, 0x14); // BT=0001, AP=100 + set_lcm_register(0x1A, 0x11); // VC3=001, VC1=001 + set_lcm_register(0x1C, 0x0D); // VRH=1101 + set_lcm_register(0x1F, 0x42); // VCM=100_0010 + MDELAY(20); + set_lcm_register(0x19, 0x0A); // GASENB=0, PON=0, DK=1, XDK=0,VLCD_TRI=1, STB=0 + set_lcm_register(0x19, 0x1A); // GASENB=0, PON=1, DK=1, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x19, 0x12); // GASENB=0, PON=1, DK=0, XDK=0,VLCD_TRI=1, STB=0 + MDELAY(40); + set_lcm_register(0x1E, 0x2C); // VCOMG=1, VDV=0_1100 + MDELAY(100); + + // Display ON Setting + set_lcm_register(0x3C, 0x60); // N_SAP=0110 0000 + set_lcm_register(0x3D, 0x40); // I_SAP =0100 0000 + set_lcm_register(0x34, 0x38); // EQS=0011 1000 + set_lcm_register(0x35, 0x38); // EQP=0011 1000 + set_lcm_register(0x24, 0x38); // PT=00,GON=1, DTE=1, D=10 + MDELAY(40); + set_lcm_register(0x24, 0x3C); // PT=00,GON=1, DTE=1, D=11 + set_lcm_register(0x16, 0x08); // MY=1,MX=1,MV=0,GS=0,BGR=1,SS=0,SRL_EN=0,SM=0 + set_lcm_register(0x01, 0x02); // IDMON=0,INVON=0,NORNO=1,PTLON=0 + set_lcm_register(0x55, 0x00); // SM_PANEL=0,SS_PANEL=0,GS_PANEL=0,REV_PANEL=0,BGR_PANEL=0 + + // Enable tearing control signal + // + set_lcm_register(0x23, 0x03); // enable TEMODE = 1 +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER bm8578_lcm_drv = +{ + .name = "bm8578", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_tinnoes73_gb/lcm/dummy/dummy.c b/cink_tinnoes73_gb/lcm/dummy/dummy.c new file mode 100755 index 0000000..bf92040 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/dummy/dummy.c @@ -0,0 +1,110 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = 0; +} + + +static void lcm_init(void) +{ +} + + +static void lcm_suspend(void) +{ +} + + +static void lcm_resume(void) +{ +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/cink_tinnoes73_gb/lcm/hx8357B/hx8357b.c b/cink_tinnoes73_gb/lcm/hx8357B/hx8357b.c new file mode 100755 index 0000000..babd0ed --- /dev/null +++ b/cink_tinnoes73_gb/lcm/hx8357B/hx8357b.c @@ -0,0 +1,282 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x46); + send_data_cmd(0x31); + send_data_cmd(0x00); + send_data_cmd(0x1A); + send_data_cmd(0x12); + send_data_cmd(0x34); + send_data_cmd(0x77); + send_data_cmd(0x13); + send_data_cmd(0x0F); + send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x51); //DDVDH 0X44 + send_data_cmd(0x42); + send_data_cmd(0x0F); //VREG1 0X08 + + send_ctrl_cmd(0xD1); //Set VCOM + send_data_cmd(0x4F); //VCOMH + send_data_cmd(0x1D); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW + send_data_cmd(0x01); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + send_ctrl_cmd(0xEE); //Set EQ + send_data_cmd(0x13); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x13); + + send_ctrl_cmd(0xED); //Set DIR TIM + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0xA2); + send_data_cmd(0xA3); + send_data_cmd(0xA3); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0x13); + send_data_cmd(0xAE); + send_data_cmd(0xAE); + send_data_cmd(0x13); + send_data_cmd(0xA2); + send_data_cmd(0x13); + + send_ctrl_cmd(0x36); + send_data_cmd(0x02); + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x70);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/cink_tinnoes73_gb/lcm/hx8357B_lenovo/hx8357b_lenovo.c b/cink_tinnoes73_gb/lcm/hx8357B_lenovo/hx8357b_lenovo.c new file mode 100755 index 0000000..34dfbf4 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/hx8357B_lenovo/hx8357b_lenovo.c @@ -0,0 +1,321 @@ +#if BUILD_UBOOT +//#include +#else +#include +#endif +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) +#define LENOVO_DVT /*LENOVO-XM jixj 2011.5.11 add ,if is a dvt machine£¬open£»if is a evt machine,close ;else LCD write error*/ + +unsigned int lcd_id; + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +unsigned int read_lcd_id() +{ + + unsigned int id,id1,id2,id3,id4,id5,id6; + send_ctrl_cmd(0xbf); + id1=read_data_cmd(); + id2=read_data_cmd(); + id3=read_data_cmd(); + id4=read_data_cmd()&0xff; + id5=read_data_cmd()&0xff; + id6=read_data_cmd(); + #if BUILD_UBOOT + printf("id4=%x,id5=%x\n",id4,id5); + #else + printk("id4=%x,id5=%x\n",id4,id5); + #endif + return (id4<<8|id5); + +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} +static void lcm_clear(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x11); //Sleep Out + MDELAY(300); + send_ctrl_cmd(0xB4); //Set RM, DM + send_data_cmd(0x00); //MPU Mode + + send_ctrl_cmd(0xC0); //Set PANEL +send_data_cmd(0x14); + send_data_cmd(0x3B); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x11); + + send_ctrl_cmd(0xC8); //Set Gamma + send_data_cmd(0x00); +send_data_cmd(0x15); +send_data_cmd(0x00); +send_data_cmd(0x22); +send_data_cmd(0x00); +send_data_cmd(0x08); +send_data_cmd(0x77); +send_data_cmd(0x26); +send_data_cmd(0x77); +send_data_cmd(0x22); +send_data_cmd(0x04); +send_data_cmd(0x00); + + send_ctrl_cmd(0xD0); //Set Power + send_data_cmd(0x44); //DDVDH 0X44 + send_data_cmd(0x41); +send_data_cmd(0x06); //VREG1 + + send_ctrl_cmd(0xD1); //Set VCOM +send_data_cmd(0x42); //VCOMH +send_data_cmd(0x0F); //VCOML + + send_ctrl_cmd(0xD2); //Set NOROW +send_data_cmd(0x05); //SAP + send_data_cmd(0x12); //DC10/00 + + send_ctrl_cmd(0xE9); //Set Panel + send_data_cmd(0x01); + + send_ctrl_cmd(0xC5); + send_data_cmd(0x0A); + send_data_cmd(0x01); + + send_ctrl_cmd(0xEA); //Set STBA + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + + + send_ctrl_cmd(0x3A); + send_data_cmd(0x66); + + send_ctrl_cmd(0x36); + send_data_cmd(0x41); + lcm_clear(0x00); + MDELAY(50); + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + //send_ctrl_cmd(0x21); + + + send_ctrl_cmd(0x29); + + +} + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + #ifdef LENOVO_DVT + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 10; + #else + params->dbi.parallel.write_setup = 2; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 6; + #endif + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 40; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + lcd_id = read_lcd_id(); + #if BUILD_UBOOT + printf("lcd_id=%x\n",lcd_id); + #else + printk("lcd_id=%x\n",lcd_id); + #endif + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ +send_ctrl_cmd(0x28); // Display off +send_ctrl_cmd(0x10); // Enter Standby mode + MDELAY(120); +} + + +static void lcm_resume(void) +{ +send_ctrl_cmd(0x11); // Standby out +MDELAY(50); +send_ctrl_cmd(0x29); // Display on + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + if(level > 255) level = 255; + send_ctrl_cmd(0x51); + send_data_cmd(level); +} + +LCM_DRIVER hx8357b_lcm_drv = +{ + .name = "hx8357b", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, +}; diff --git a/cink_tinnoes73_gb/lcm/hx8369/hx8369.c b/cink_tinnoes73_gb/lcm/hx8369/hx8369.c new file mode 100755 index 0000000..e04e2ce --- /dev/null +++ b/cink_tinnoes73_gb/lcm/hx8369/hx8369.c @@ -0,0 +1,531 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB0); // SET Freq for fps + send_data_cmd(0x01); + send_data_cmd(0x08); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING; +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() + + +#define LCM_DSI_CMD_MODE + +static void init_lcm_registers(void) +{ + unsigned int data_array[16]; + +#if defined(LCM_DSI_CMD_MODE) + { + data_array[0]=0x00043902; + data_array[1]=0x6983FFB9; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0]=0x00103902; + data_array[1]=0x032000B2; + data_array[2]=0xFF007003; + data_array[3]=0x00000000; + data_array[4]=0x01000303; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0]=0x00063902; + data_array[1]=0x700800B4; + data_array[2]=0x0000060E; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; + data_array[1] = 0x030100D5; + data_array[2] = 0x08020100; + data_array[3] = 0x00131180; + data_array[4] = 0x51064000; + data_array[5] = 0x71000007; + data_array[6] = 0x07046005; + data_array[7] = 0x0000060F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00143902; + data_array[1] = 0x340085B1; + data_array[2] = 0x0E0E0006; + data_array[3] = 0x1A1A2C24; + data_array[4] = 0xE6013A07; + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + // color format + { + // RGB565 + //data_array[0] = 0x053A1500; + // RGB666 + //data_array[0] = 0x063A1500; + // RGB888 + data_array[0] = 0x073A1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } + + data_array[0] = 0x02CC1500; + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00033902; + data_array[1] = 0x006C6CB6 ; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + // ENABLE FMARK + //data_array[0] = 0x00023902; + //data_array[1] = 0x00000035 ; + //dsi_set_cmdq(&data_array, 2, 1); + //MDELAY(10); + + //data_array[0] = 0x00351500; + //dsi_set_cmdq(&data_array, 1, 1); + //MDELAY(10); + + // SET GAMMA + data_array[0] = 0x00233902; + data_array[1] = 0x140C00E0; + data_array[2] = 0x293F3F3F; + data_array[3] = 0x0F0C0654; + data_array[4] = 0x15131513; + data_array[5] = 0x0C001F14; + data_array[6] = 0x3F3F3F14; + data_array[7] = 0x0C065429; + data_array[8] = 0x1315130F; + data_array[9] = 0x001F1415; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + + data_array[0] = 0x000E3902; //// SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA ; + data_array[2] = 0x10000A00 ; + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018 ; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + } +#else + { + data_array[0] = 0x00043902; // SET password + data_array[1] = 0x6983FFB9; // + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x00143902; //// SET Power + data_array[1] = 0x340085B1; // + data_array[2] = 0x0F0F0007; // + data_array[3] = 0x3F3F322A; // + data_array[4] = 0xE6013A01; // + data_array[5] = 0xE6E6E6E6; + dsi_set_cmdq(&data_array, 6, 1); + MDELAY(10); + + data_array[0] = 0x00103902; //// SET Display 480x800 + data_array[1] = 0x032300B2; // + data_array[2] = 0xFF007003; // + data_array[3] = 0x00000000; // + data_array[4] = 0x01000303; // + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00063902; // SET Display + data_array[1] = 0x801800B4; + data_array[2] = 0x00000206; + dsi_set_cmdq(&data_array, 3, 1); + MDELAY(10); + + data_array[0] = 0x00033902; //// SET VCOM + data_array[1] = 0x004242B6; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + + data_array[0] = 0x001B3902; //// SET GIP + data_array[1] = 0x030400D5; + data_array[2] = 0x28050100; + data_array[3] = 0x00030170; + data_array[4] = 0x51064000; + data_array[5] = 0x41000007; + data_array[6] = 0x07075006; + data_array[7] = 0x0000040F; + dsi_set_cmdq(&data_array, 8, 1); + MDELAY(10); + + data_array[0] = 0x00233902; //// SET GAMMA + data_array[1] = 0x191300E0; // + data_array[2] = 0x283F3D38; // + data_array[3] = 0x0E0D0746; // + data_array[4] = 0x14121512; // + data_array[5] = 0x1300170F; + data_array[6] = 0x3F3D3819; + data_array[7] = 0x0D074628; + data_array[8] = 0x1215120E; + data_array[9] = 0x00170F14; + dsi_set_cmdq(&data_array, 10, 1); + MDELAY(10); + +#if 0 + switch(g_ColorFormat) + { + case PACKED_RGB565: + data_array[0] = 0x553A1500; // SET pixel format + break; + + case LOOSED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + case PACKED_RGB888: + data_array[0] = 0x773A1500; // SET pixel format + break; + + case PACKED_RGB666: + data_array[0] = 0x663A1500; // SET pixel format + break; + + default: + //dbg_print("Format setting error \n\r"); + while(1); + break; + } + + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +#endif + data_array[0] = 0x000E3902; // SET MIPI (1 or 2 Lane) + data_array[1] = 0xC6A000BA; // + data_array[2] = 0x10000A00; // + if (0)//(g_LaneNumber==1) + { + data_array[3] = 0x10026F30; + } + else + { + data_array[3] = 0x11026F30; + } + data_array[4] = 0x00004018; + dsi_set_cmdq(&data_array, 5, 1); + MDELAY(10); + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + } +#endif + //------------------------------------------------------------------------ + // LUT for HX8369 + //------------------------------------------------------------------------ + if (1)//(g_ColorFormat==0) + { + data_array[0] = 0x00C13902; //Set Color LUT 1 + data_array[1] = 0x1008002D; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000FF; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT 2 + data_array[1] = 0x08040000; + data_array[2] = 0x1814100C; + data_array[3] = 0x2824201C; + data_array[4] = 0x3834302C; + data_array[5] = 0x4844403C; + data_array[6] = 0x5854504C; + data_array[7] = 0x6864605C; + data_array[8] = 0x7874706C; + data_array[9] = 0x8884807C; + data_array[10] = 0x9894908C; + data_array[11] = 0xA8A4A09C; + data_array[12] = 0xB8B4B0AC; + data_array[13] = 0xC8C4C0BC; + data_array[14] = 0xD8D4D0CC; + data_array[15] = 0xE8E4E0DC; + dsi_set_cmdq(&data_array, 16, 1); + + MDELAY(10); + + data_array[0] = 0xF8F4F0EC; //Set Color LUT 3 + data_array[1] = 0x100800FC; + data_array[2] = 0x30282018; + data_array[3] = 0x50484038; + data_array[4] = 0x70686058; + data_array[5] = 0x90888078; + data_array[6] = 0xB0A8A098; + data_array[7] = 0xD0C8C0B8; + data_array[8] = 0xF0E8E0D8; + data_array[9] = 0x000000F8; + data_array[10] = 0x00000000; + data_array[11] = 0x00000000; + data_array[12] = 0x00000000; + data_array[13] = 0x00000000; + data_array[14] = 0x00000000; + data_array[15] = 0x00000000; + dsi_set_cmdq(&data_array, 16, 1); + MDELAY(10); + + data_array[0] = 0x00000000; //Set Color LUT + data_array[1] = 0x00000000; + dsi_set_cmdq(&data_array, 2, 1); + MDELAY(10); + } + +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; +#if defined(LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; +#else + params->dsi.mode = SYNC_EVENT_VDO_MODE; +#endif + params->ctrl = LCM_CTRL_PARALLEL_DBI; + //params->ctrl = LCM_CTRL_NONE; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // DBI + //params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_mode = LCM_DBI_TE_MODE_DISABLED; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + // DPI + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.intermediat_buffer_num = 2; + + // DSI + params->dsi.DSI_WMEM_CONTI=0x3C; + params->dsi.DSI_RMEM_CONTI=0x3E; + //params->dsi.LANE_NUM=LCM_ONE_LANE; + params->dsi.LANE_NUM=LCM_TWO_LANE; + params->dsi.VC_NUM=0x0; + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=480*3; + + params->dsi.vertical_sync_active=2; + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + params->dsi.vertical_active_line=800; + + params->dsi.line_byte=2180; // 2256 = 752*3 + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(480*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + params->dsi.HS_TRAIL=0x14; + params->dsi.HS_ZERO=0x14; + params->dsi.HS_PRPR=0x0A; + params->dsi.LPX=0x05; + + params->dsi.TA_SACK=0x01; + params->dsi.TA_GET=0x37; + params->dsi.TA_SURE=0x16; + params->dsi.TA_GO=0x10; + + params->dsi.CLK_TRAIL=0x14; + params->dsi.CLK_ZERO=0x14; + params->dsi.LPX_WAIT=0x0A; + params->dsi.CONT_DET=0x00; + + params->dsi.CLK_HS_PRPR=0x0A; + + params->dsi.pll_div1=37; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + + //params->dsi.pll_div2=4; // div2=0~15: fout=fvo/(2*div2) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + + data_array[0]=0x00280500; // Display Off + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); + data_array[0] = 0x00100500; // Sleep In + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); +} + + +static void lcm_resume(void) +{ + unsigned int data_array[16]; + + data_array[0] = 0x00110500; // Sleep Out + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(100); + data_array[0] = 0x00290500; // Display On + dsi_set_cmdq(&data_array, 1, 1); + MDELAY(10); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + //data_array[6]= 0x002c3901; + + dsi_set_cmdq(&data_array, 7, 0); + +} + +LCM_DRIVER hx8369_dsi_lcm_drv = +{ + .name = "hx8369_dsi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +#if defined(LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif + }; diff --git a/cink_tinnoes73_gb/lcm/hx8369_hvga/hx8369_hvga.c b/cink_tinnoes73_gb/lcm/hx8369_hvga/hx8369_hvga.c new file mode 100755 index 0000000..ace0e95 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/hx8369_hvga/hx8369_hvga.c @@ -0,0 +1,574 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x69) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0xFF&lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned short x0, y0, x1, y1, x, y; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)0; + y0 = (unsigned short)0; + x1 = (unsigned short)FRAME_WIDTH-1; + y1 = (unsigned short)FRAME_HEIGHT-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0xB9); // SET password + send_data_cmd(0xFF); + send_data_cmd(0x83); + send_data_cmd(0x69); + + send_ctrl_cmd(0xB1); //Set Power + send_data_cmd(0x85); + send_data_cmd(0x00); + send_data_cmd(0x34); + send_data_cmd(0x0A); + send_data_cmd(0x00); + send_data_cmd(0x0F); + send_data_cmd(0x0F); + send_data_cmd(0x2A); + send_data_cmd(0x32); + send_data_cmd(0x3F); + send_data_cmd(0x3F); + send_data_cmd(0x01); + send_data_cmd(0x23); + send_data_cmd(0x01); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + send_data_cmd(0xE6); + + send_ctrl_cmd(0xB2); // SET Display 480x800 + send_data_cmd(0x00); + send_data_cmd(0x20); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x70); + send_data_cmd(0x00); + send_data_cmd(0xFF); + send_data_cmd(0x06); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x03); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + + send_ctrl_cmd(0xB4); // SET Display column inversion + send_data_cmd(0x00); + send_data_cmd(0x18); + send_data_cmd(0x80); + send_data_cmd(0x06); + send_data_cmd(0x02); + + send_ctrl_cmd(0xB6); // SET VCOM + send_data_cmd(0x3A); + send_data_cmd(0x3A); + + send_ctrl_cmd(0xD5); + send_data_cmd(0x00); + send_data_cmd(0x02); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x28); + send_data_cmd(0x70); + send_data_cmd(0x01); + send_data_cmd(0x03); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x40); + send_data_cmd(0x06); + send_data_cmd(0x51); + send_data_cmd(0x07); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x41); + send_data_cmd(0x06); + send_data_cmd(0x50); + send_data_cmd(0x07); + send_data_cmd(0x07); + send_data_cmd(0x0F); + send_data_cmd(0x04); + send_data_cmd(0x00); + + send_ctrl_cmd(0xE0); // Set Gamma + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + send_data_cmd(0x00); + send_data_cmd(0x13); + send_data_cmd(0x19); + send_data_cmd(0x38); + send_data_cmd(0x3D); + send_data_cmd(0x3F); + send_data_cmd(0x28); + send_data_cmd(0x46); + send_data_cmd(0x07); + send_data_cmd(0x0D); + send_data_cmd(0x0E); + send_data_cmd(0x12); + send_data_cmd(0x15); + send_data_cmd(0x12); + send_data_cmd(0x14); + send_data_cmd(0x0F); + send_data_cmd(0x17); + + send_ctrl_cmd(0xC1); // Set DGC + send_data_cmd(0x01); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + send_data_cmd(0x04); + send_data_cmd(0x13); + send_data_cmd(0x1A); + send_data_cmd(0x20); + send_data_cmd(0x27); + send_data_cmd(0x2C); + send_data_cmd(0x32); + send_data_cmd(0x36); + send_data_cmd(0x3F); + send_data_cmd(0x47); + send_data_cmd(0x50); + send_data_cmd(0x59); + send_data_cmd(0x60); + send_data_cmd(0x68); + send_data_cmd(0x71); + send_data_cmd(0x7B); + send_data_cmd(0x82); + send_data_cmd(0x89); + send_data_cmd(0x91); + send_data_cmd(0x98); + send_data_cmd(0xA0); + send_data_cmd(0xA8); + send_data_cmd(0xB0); + send_data_cmd(0xB8); + send_data_cmd(0xC1); + send_data_cmd(0xC9); + send_data_cmd(0xD0); + send_data_cmd(0xD7); + send_data_cmd(0xE0); + send_data_cmd(0xE7); + send_data_cmd(0xEF); + send_data_cmd(0xF7); + send_data_cmd(0xFE); + send_data_cmd(0xCF); + send_data_cmd(0x52); + send_data_cmd(0x34); + send_data_cmd(0xF8); + send_data_cmd(0x51); + send_data_cmd(0xF5); + send_data_cmd(0x9D); + send_data_cmd(0x75); + send_data_cmd(0x00); + + send_ctrl_cmd(0x3A); // set Interface Pixel Format + send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel + + send_ctrl_cmd(0x51);//write display brightness + send_data_cmd(0x00);//set brightness 0x00-0xff + MDELAY(50); + + send_ctrl_cmd(0x53);//write ctrl display + send_data_cmd(0x24); + MDELAY(50); + + send_ctrl_cmd(0x55); + send_data_cmd(0x01);//still picture + MDELAY(50); + + send_ctrl_cmd(0x5e);//write CABC minumum brightness + send_data_cmd(0x70);// + MDELAY(50); + + send_ctrl_cmd(0xCA); //Set UI GAIN + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x24); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x23); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + send_data_cmd(0x22); + + send_ctrl_cmd(0x11); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB888; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_24BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 20; + params->dbi.parallel.wait_period = 0; + +/* // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_FALLING;*/ +} + +static unsigned int lcm_check_status(void) +{ + send_ctrl_cmd(0xB9); + if(read_data_cmd() != 0x00) return 0; + if(read_data_cmd() != 0xff) return 0; + if(read_data_cmd() != 0x83) return 0; + if(read_data_cmd() != 0x69) return 0; + + return 1; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + + //Set TE register + send_ctrl_cmd(0x35); + send_data_cmd(0x00); + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + //sw_clear_panel(0); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x10); + MDELAY(120); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x11); + MDELAY(120); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned short x0, y0, x1, y1; + unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + x0 = (unsigned short)x; + y0 = (unsigned short)y; + x1 = (unsigned short)x+width-1; + y1 = (unsigned short)y+height-1; + + h_X_start=((x0&0xFF00)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0xFF00)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0xFF00)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0xFF00)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd(0x2A); + send_data_cmd(h_X_start); + send_data_cmd(l_X_start); + send_data_cmd(h_X_end); + send_data_cmd(l_X_end); + + send_ctrl_cmd(0x2B); + send_data_cmd(h_Y_start); + send_data_cmd(l_Y_start); + send_data_cmd(h_Y_end); + send_data_cmd(l_Y_end); + + send_ctrl_cmd(0x29); + + send_ctrl_cmd(0x2C); +} + +// this is for default brightness adjustment +// android default brightness level is 102 +// we will remap this level to ensure lcm brightness is about 68cd. +void lcm_setbacklight(unsigned int level) +{ + unsigned int default_level = 52; + unsigned int mapped_level = 0; + if(level > 255) + mapped_level = 255; + + if(level >= 102) + mapped_level = default_level+(level-102)*(255-default_level)/(255-102); + else + mapped_level = default_level-(102-level)*default_level/102; + + send_ctrl_cmd(0x51); + send_data_cmd(mapped_level); +} + +void lcm_setpwm(unsigned int divider) +{ + send_ctrl_cmd(0xC9); + + send_data_cmd(0x3E); + send_data_cmd(0x00); + send_data_cmd(0x00); + send_data_cmd(0x01); + send_data_cmd(0x0F | (divider<<4)); +// send_data_cmd(0x2F); + send_data_cmd(0x02); + send_data_cmd(0x1E); + send_data_cmd(0x1E); + send_data_cmd(0x00); +} + +unsigned int lcm_getpwm(unsigned int divider) +{ +// ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; +// pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1< + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd() +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // AUO 3.17" + ILI9481 + + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); + send_data_cmd(0X0007); + send_data_cmd(0X0041); + send_data_cmd(0X001B); + + send_ctrl_cmd(0X00D1); + send_data_cmd(0X0000); + send_data_cmd(0X0016); // 0x001b + send_data_cmd(0X0012); + + send_ctrl_cmd(0X00D2); + send_data_cmd(0X0001); + send_data_cmd(0X0011); + + send_ctrl_cmd(0X00C0); + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0002); + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X00F3); + send_data_cmd(0X0040); + send_data_cmd(0X000A); + send_ctrl_cmd(0X00F6); + send_data_cmd(0X0080); + send_ctrl_cmd(0X00F7); + send_data_cmd(0X0080); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 1; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 1; + params->dbi.parallel.read_latency = 31; + params->dbi.parallel.wait_period = 2; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(200); + SET_RESET_PIN(1); + MDELAY(400); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x29); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + // Write To GRAM + send_ctrl_cmd(0x2C); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER ili9481_lcm_drv = +{ + .name = "ili9481", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, +}; diff --git a/cink_tinnoes73_gb/lcm/ili9481_dpi/ili9481_dpi.c b/cink_tinnoes73_gb/lcm/ili9481_dpi/ili9481_dpi.c new file mode 100755 index 0000000..cc1ce2a --- /dev/null +++ b/cink_tinnoes73_gb/lcm/ili9481_dpi/ili9481_dpi.c @@ -0,0 +1,406 @@ +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +#define dbg_print //printf + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +/* #define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) */ +/* #define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) */ +/* #define LSDA_GPIO_PIN (GPIO_DISP_LSA0_PIN) */ +/* #define LSA0_GPIO_PIN (GPIO_DISP_LSDA_PIN) */ + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +#define ICID_MODE 0 +#define SET_ICID_HIGH SET_GPIO_OUT(GPIO36, 1) +#define SET_ICID_LOW SET_GPIO_OUT(GPIO36, 0) + +#define GET_LSA0_IN mt_get_gpio_in(LSA0_GPIO_PIN) +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + int clk_num; + int clk_mask; + + UDELAY(100); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(100); + + clk_num = 9; + clk_mask = 0x100; + dbg_print("\n^"); + UDELAY(50); + for (i = 0; i < clk_num; ++ i) + { + SET_LSCK_LOW; + if (data & (clk_mask)) { // 0x80= (1 << (9-1)) + SET_LSDA_HIGH; + dbg_print("~1"); + } else { + SET_LSDA_LOW; + dbg_print("~0"); + } + UDELAY(100); + SET_LSCK_HIGH; + UDELAY(100); + data <<= 1; + } + dbg_print("\n"); + + SET_ICID_HIGH; + + SET_LSDA_HIGH; +} + +static __inline void spi_send_data_ICID(unsigned int data) +{ + unsigned int i; + + UDELAY(100); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(100); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_LOW; + if (data & (0x100)) { // 0x80= (1 << (9-1)) + SET_LSDA_HIGH; + dbg_print("~1"); + } else { + SET_LSDA_LOW; + dbg_print("~0"); + } + UDELAY(100); + SET_LSCK_HIGH; + UDELAY(100); + data <<= 1; + } + + SET_LSDA_HIGH; +} + +static __inline unsigned int spi_read_data(void) +{ + unsigned int i; + s32 inA0 = -1; + + UDELAY(100); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(100); + + for (i = 0; i < 9; ++ i) + { + SET_LSCK_LOW; + /* if (data & (0x100)) { // 0x80= (1 << (9-1)) */ + /* SET_LSDA_HIGH; */ + /* dbg_print("~1"); */ + /* } else { */ + /* SET_LSDA_LOW; */ + /* dbg_print("~0"); */ + /* } */ + UDELAY(100); + inA0 = GET_LSA0_IN; + //printf("`%d",inA0); + SET_LSCK_HIGH; + UDELAY(100); + } + //printf("\n"); + + + SET_LSDA_HIGH; +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): cmd:0x%x \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__,cmd); + + unsigned int out = (cmd & 0xFF); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : data:0x%x \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__, data); + + unsigned int out = (data & 0xFF)| 0x100; + spi_send_data(out); +} + +#define LCD_WRITE_CMD(cmd) SET_LSCE_LOW;send_ctrl_cmd(cmd);SET_LSCE_HIGH +#define LCD_WRITE_DATA(data) SET_LSCE_LOW;send_data_cmd(data);SET_LSCE_HIGH + + +static void InitLCD_ILI9481_HVGA_CPT32() +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + //************* Start Initial Sequence **********// + MDELAY(100); // Delay 100 ms + LCD_WRITE_CMD(0x11); //Exit Sleep + MDELAY(20); + + LCD_WRITE_CMD(0xD0); //Power Setting + LCD_WRITE_DATA(0x07); + LCD_WRITE_DATA(0x42); + LCD_WRITE_DATA(0x18); + + LCD_WRITE_CMD(0xD1); //Vcom control + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x16);//07 + LCD_WRITE_DATA(0x0E); + + LCD_WRITE_CMD(0xD2); //Power setting for Normal mode + LCD_WRITE_DATA(0x01); + LCD_WRITE_DATA(0x02); + + LCD_WRITE_CMD(0xC0); //Panel Driver setting. + LCD_WRITE_DATA(0x10); + LCD_WRITE_DATA(0x3B); + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x02); + LCD_WRITE_DATA(0x11); + + LCD_WRITE_CMD(0xC5); //Frame rate and inversion control + LCD_WRITE_DATA(0x03); + + LCD_WRITE_CMD(0xC8); //Gamma setting + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x32); + LCD_WRITE_DATA(0x36); + LCD_WRITE_DATA(0x45); + LCD_WRITE_DATA(0x06); + LCD_WRITE_DATA(0x16); + LCD_WRITE_DATA(0x37); + LCD_WRITE_DATA(0x75); + LCD_WRITE_DATA(0x77); + LCD_WRITE_DATA(0x54); + LCD_WRITE_DATA(0x0C); + LCD_WRITE_DATA(0x00); + + LCD_WRITE_CMD(0x36); //Set address mode + //LCD_WRITE_DATA(0x0A); + LCD_WRITE_DATA(0x09); //Flip Vertically and Horizontally + + LCD_WRITE_CMD(0x3A);// set pixel format + LCD_WRITE_DATA(0x66); + + // LCD_WRITE_CMD(0x0C); //get pixel format + // LCD_WRITE_DATA(0x66); + + LCD_WRITE_CMD(0x2A); //set colum address + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x01); + LCD_WRITE_DATA(0x40); + + LCD_WRITE_CMD(0x2B);//set page address + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x00); + LCD_WRITE_DATA(0x01); + LCD_WRITE_DATA(0xE0); + MDELAY(120); + + LCD_WRITE_CMD(0xB4); //Display mode and Frame memory write mode setting. + LCD_WRITE_DATA(0x10); + + LCD_WRITE_CMD(0x29);//set display on + + LCD_WRITE_CMD(0x2C);// write memory start +} + + +static void config_gpio(void) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + // CLK + params->dpi.mipi_pll_clk_ref = 1; + params->dpi.mipi_pll_clk_div1 = 8; + params->dpi.mipi_pll_clk_div2 = 3; + params->dpi.dpi_clk_div = 4; + params->dpi.dpi_clk_duty = 2; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + //params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + // Hsync Vsync + params->dpi.hsync_pulse_width = 1; + params->dpi.hsync_back_porch = 0; + params->dpi.hsync_front_porch = 0; + params->dpi.vsync_pulse_width = 1; + params->dpi.vsync_back_porch = 0; + params->dpi.vsync_front_porch = 0; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 1; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + config_gpio(); + + SET_RESET_PIN(0); + SET_LSCE_HIGH; + SET_LSCK_HIGH; + + MDELAY(300); + SET_RESET_PIN(1); + MDELAY(2); + + InitLCD_ILI9481_HVGA_CPT32(); +} + + +static void lcm_suspend(void) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + LCD_WRITE_CMD(0x10); +} + + +static void lcm_resume(void) +{ + dbg_print("===> [ILI9481_DPI] <%s %s> %s:%d %s(): : \n", __DATE__, __TIME__, __FILE__, __LINE__, __func__); + + LCD_WRITE_CMD(0x11); + LCD_WRITE_CMD(0x29); + MDELAY(120); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + + +LCM_DRIVER ili9481_dpi_lcm_drv = + { + .name = "ili9481_dpi", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + + +const LCM_DRIVER* LCM_GetDriver() +{ + static const LCM_DRIVER LCM_DRV = + { + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume + }; + + return &LCM_DRV; +} + diff --git a/cink_tinnoes73_gb/lcm/inc/lcm_drv.h b/cink_tinnoes73_gb/lcm/inc/lcm_drv.h new file mode 100755 index 0000000..b4f7bcf --- /dev/null +++ b/cink_tinnoes73_gb/lcm/inc/lcm_drv.h @@ -0,0 +1,409 @@ +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_latency; + unsigned int wait_period; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + LCM_LANE_NUM LANE_NUM; + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned int pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + unsigned int (*check_status)(void); +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/cink_tinnoes73_gb/lcm/lg4571/lg4571.c b/cink_tinnoes73_gb/lcm/lg4571/lg4571.c new file mode 100755 index 0000000..22c7dea --- /dev/null +++ b/cink_tinnoes73_gb/lcm/lg4571/lg4571.c @@ -0,0 +1,331 @@ +#include +#ifdef BUILD_UBOOT +#include +#else +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define SET_LSCE_LOW SET_GPIO_OUT(LSCE_GPIO_PIN, 0) +#define SET_LSCE_HIGH SET_GPIO_OUT(LSCE_GPIO_PIN, 1) +#define SET_LSCK_LOW SET_GPIO_OUT(LSCK_GPIO_PIN, 0) +#define SET_LSCK_HIGH SET_GPIO_OUT(LSCK_GPIO_PIN, 1) +#define SET_LSDA_LOW SET_GPIO_OUT(LSDA_GPIO_PIN, 0) +#define SET_LSDA_HIGH SET_GPIO_OUT(LSDA_GPIO_PIN, 1) + +static __inline void spi_send_data(unsigned int data) +{ + unsigned int i; + + SET_LSCE_LOW; + UDELAY(1); + SET_LSCK_HIGH; + SET_LSDA_HIGH; + UDELAY(1); + + for (i = 0; i < 24; ++ i) + { + SET_LSCK_LOW; + if (data & (1 << 23)) { + SET_LSDA_HIGH; + } else { + SET_LSDA_LOW; + } + UDELAY(1); + SET_LSCK_HIGH; + UDELAY(1); + data <<= 1; + } + + SET_LSDA_HIGH; + SET_LSCE_HIGH; +} + +#define DEVIE_ID (0x1C << 18) + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned int out = (DEVIE_ID | ((cmd & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void send_data_cmd(unsigned int data) +{ + unsigned int out = (DEVIE_ID | (0x2 << 16) | ((data & 0xFF) << 8)); + spi_send_data(out); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + // Power Setting + set_lcm_register(0x40, 0x00); // SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + + set_lcm_register(0x42, 0x03); // DIVE=3 + set_lcm_register(0x43, 0x40); // DC0=0,DC1=4 + set_lcm_register(0x44, 0x31); // VCOMG=1,VBSL0=1,VBSL1=1 + set_lcm_register(0x45, 0x20); // VC=0,BT=2 + set_lcm_register(0x46, 0xF1); // APR=1,VRD=F (*) + set_lcm_register(0x47, 0xAA); // VRH=A + set_lcm_register(0x49, 0x12); // VDV=12 + set_lcm_register(0x4A, 0x22); // CHU=2,CLU=2 + + // Display Setting + set_lcm_register(0x02, 0x21); // NL=1,DSZ=2 + set_lcm_register(0x03, 0x04); // NW=0,BC=1 + set_lcm_register(0x04, 0x09); // HBP=9 + set_lcm_register(0x05, 0x04); // VBP=4 + set_lcm_register(0x06, 0x00); // DPL=0,HPL=0,VPL=0,EPL=0,RIM=0,ENE=0 + set_lcm_register(0x08, 0x03); // SS=1,BGR=1,REV=0 + set_lcm_register(0x09, 0x03); // SDTE=3 (*) + set_lcm_register(0x0A, 0x55); // EQWE=5,EQWE2=5 (*) + set_lcm_register(0x0B, 0x01); // MNT=1,ST=0 + + // Outline Sharpening + set_lcm_register(0x10, 0x40); // EEE=0,COE=4 + set_lcm_register(0x11, 0x00); // EHSA=000 + set_lcm_register(0x12, 0x00); + set_lcm_register(0x13, 0x3F); + set_lcm_register(0x14, 0x01); // EHEA=13F + set_lcm_register(0x15, 0x00); + set_lcm_register(0x16, 0x00); // EVSA=000 + set_lcm_register(0x17, 0x1F); + set_lcm_register(0x18, 0x03); // EVEA=31F + + set_lcm_register(0x19, 0x80); // Contrast:CNTR=80 + set_lcm_register(0x1A, 0x80); // Contrast:CNTG=80 + set_lcm_register(0x1B, 0x80); // Contrast:CNTB=80 + set_lcm_register(0x1C, 0x40); // Bright:BRTR=40 + set_lcm_register(0x1D, 0x40); // Bright:BRTG=40 + set_lcm_register(0x1E, 0x40); // Bright:BRTB=40 + + // Gate Circuit Setting + set_lcm_register(0x20, 0x13); // GG=1,FL=1,FG=1 (*) + set_lcm_register(0x21, 0x20); // GNP=0,GLOL=2 + set_lcm_register(0x22, 0x32); // ACFIX=3,ACCYC=2 (*) + set_lcm_register(0x23, 0x43); // ACR=3,ACF=4 + set_lcm_register(0x24, 0x43); // ACBR=3,ACBF=4 + set_lcm_register(0x25, 0x25); // AC2R=5,AC2F=2 + set_lcm_register(0x26, 0x25); // ACB2R=5,ACB2F=2 + + // DCDC Setting + set_lcm_register(0x30, 0x15); // RGAP=1,RGPRO=1,RGVLT=1 + set_lcm_register(0x31, 0x50); // RGCYC=0,RGSTP=5 (*) + set_lcm_register(0x32, 0x48); // RGMIN=0,RGHC=1,RGMAX=4 + set_lcm_register(0x34, 0x29); // RGSFT=1,HTMG=1,RGSFS=2 (*) + set_lcm_register(0x35, 0x21); // RGCS=1,RGCST=2 + + // Analog + set_lcm_register(0x50, 0x53); // HIZ=3,HYP=5 + set_lcm_register(0x60, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x61, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x62, 0x30); // HIZ=3,HYP=5 (*) + set_lcm_register(0x63, 0xA8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x64, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x65, 0x86); // HIZ=3,HYP=5 (*) + set_lcm_register(0x66, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x67, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x68, 0x01); // HIZ=3,HYP=5 (*) + set_lcm_register(0x69, 0x77); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6A, 0x06); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6B, 0x69); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6C, 0xB8); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6D, 0x9B); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6E, 0x02); // HIZ=3,HYP=5 (*) + set_lcm_register(0x6F, 0x00); // HIZ=3,HYP=5 + set_lcm_register(0x70, 0x0A); // HIZ=3,HYP=5 (*) + set_lcm_register(0x71, 0x00); // HIZ=3,HYP=5 + + // Digital V + set_lcm_register(0x80, 0x20); // GMRA=20 + set_lcm_register(0x81, 0x40); // CMRB=40 + set_lcm_register(0x82, 0x80); // CMRC=80 + set_lcm_register(0x83, 0xC0); // CMRD=C0 + set_lcm_register(0x84, 0x20); // CMGA=20 + set_lcm_register(0x85, 0x40); // CMGB=40 + set_lcm_register(0x86, 0x80); // CMGC=80 + set_lcm_register(0x87, 0xC0); // CMGD=C0 + set_lcm_register(0x88, 0x20); // CMBA=20 + set_lcm_register(0x89, 0x40); // CMBB=40 + set_lcm_register(0x8A, 0x80); // CMBC=80 + set_lcm_register(0x8B, 0xC0); // CMBD=C0 + + set_lcm_register(0x01, 0x10); // Display control:D=0,DTE=0,GON=1,CON=0 + set_lcm_register(0x41, 0x02); // Power setting:AP=2,PON=0,COM=0,LON=0 + set_lcm_register(0x40, 0x10); // Power setting:SAP=1 + MDELAY(20); + set_lcm_register(0x41, 0x32); // Power setting:AP=2,PON=1,COM=1,LON=0 + MDELAY(50); + set_lcm_register(0x41, 0xB2); // Power setting:AP=2,PON=1,COM=1,LON=1 (+) + MDELAY(30); + set_lcm_register(0x01, 0x11); // Display control:D=1,DTE=0,GON=1,CON=0 + MDELAY(20); + set_lcm_register(0x01, 0x33); // Display control:D=3,DTE=0,GON=1,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x3B); // Display control:D=3,DTE=1,GON=1,CON=1 + MDELAY(40); + set_lcm_register(0x22, 0x02); // Gate circuit setting:ACFIX=0,ACCYC=2 (+) +} + + +static void config_gpio(void) +{ + const unsigned int USED_GPIOS[] = + { + LSCE_GPIO_PIN, + LSCK_GPIO_PIN, + LSDA_GPIO_PIN + }; + + unsigned int i; + + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_GPIO); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_GPIO); + + for (i = 0; i < ARY_SIZE(USED_GPIOS); ++ i) + { + lcm_util.set_gpio_dir(USED_GPIOS[i], 1); // GPIO out + lcm_util.set_gpio_pull_enable(USED_GPIOS[i], 0); + } + + // Swithc LSA0 pin to GPIO mode to avoid data contention, + // since A0 is connected to LCM's SPI SDO pin + // + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, 0); // GPIO in +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_GPIO; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 42; + params->dpi.mipi_pll_clk_div2 = 10; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_FALLING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 4; + params->dpi.hsync_back_porch = 10; + params->dpi.hsync_front_porch = 18; + params->dpi.vsync_pulse_width = 2; + params->dpi.vsync_back_porch = 2; + params->dpi.vsync_front_porch = 14; + + params->dpi.format = LCM_DPI_FORMAT_RGB666; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_4MA; +} + + +static void lcm_init(void) +{ + config_gpio(); + + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x01, 0x2A); // Display control:D=2,DTE=1,GON=0,CON=1 + MDELAY(20); + set_lcm_register(0x01, 0x00); // Display control:D=0,DTE=0,GON=0,CON=0 + MDELAY(20); + set_lcm_register(0x40, 0x00); // Power setting:SAP=0 + set_lcm_register(0x41, 0x00); // AP=0,PON=0,COM=0,LON=0 + MDELAY(80); + set_lcm_register(0x40, 0x04); // Deep standby +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(1) + MDELAY(1); + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(2) + set_lcm_register(0x40, 0x00); // DSTB mode cancellation(3) + + init_lcm_registers(); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER lg4571_lcm_drv = +{ + .name = "lg4571", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_tinnoes73_gb/lcm/mt65xx_lcm_list.c b/cink_tinnoes73_gb/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..e27f3f8 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/mt65xx_lcm_list.c @@ -0,0 +1,79 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER zte6516_lcm_drv; + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(ZTE6516) + &zte6516_lcm_drv, +#endif +#if defined(HX8357B_LENOVO) + &hx8357b_lcm_drv +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/cink_tinnoes73_gb/lcm/mtk_cust.mk b/cink_tinnoes73_gb/lcm/mtk_cust.mk new file mode 100755 index 0000000..c180615 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/mtk_cust.mk @@ -0,0 +1,3 @@ +# Used for UBOOT +DST_FOLDER = bootable/bootloader/uboot/board/mt6516/custom +#ANDROID_MK_DIR = external/mediatek/mhal/src/custom diff --git a/cink_tinnoes73_gb/lcm/nt35582/nt35582.c b/cink_tinnoes73_gb/lcm/nt35582/nt35582.c new file mode 100755 index 0000000..c403c7a --- /dev/null +++ b/cink_tinnoes73_gb/lcm/nt35582/nt35582.c @@ -0,0 +1,348 @@ +#include + +#if defined(BUILD_UBOOT) + #include +#else + #include +#endif + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +/* +#define LSA0_GPIO_PIN (GPIO_DISP_LSA0_PIN) +#define LSCE_GPIO_PIN (GPIO_DISP_LSCE_PIN) +#define LSCK_GPIO_PIN (GPIO_DISP_LSCK_PIN) +#define LSDA_GPIO_PIN (GPIO_DISP_LSDA_PIN) +*/ +#define LSA0_GPIO_PIN (GPIO103) +#define LSCE_GPIO_PIN (GPIO105) +#define LSCK_GPIO_PIN (GPIO102) +#define LSDA_GPIO_PIN (GPIO104) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +/*static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_DISP_LSA0_PIN_M_LSA); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_DISP_LSCE_PIN_M_LSCE0B); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_DISP_LSCK_PIN_M_LSCK); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_DISP_LSDA_PIN_M_SDA); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +*/ +static void config_gpio(void) +{ + lcm_util.set_gpio_mode(LSA0_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCE_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSCK_GPIO_PIN, GPIO_MODE_01); + lcm_util.set_gpio_mode(LSDA_GPIO_PIN, GPIO_MODE_01); + + lcm_util.set_gpio_dir(LSA0_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCE_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSCK_GPIO_PIN, GPIO_DIR_OUT); + lcm_util.set_gpio_dir(LSDA_GPIO_PIN, GPIO_DIR_OUT); + + lcm_util.set_gpio_pull_enable(LSA0_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCE_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSCK_GPIO_PIN, GPIO_PULL_DISABLE); + lcm_util.set_gpio_pull_enable(LSDA_GPIO_PIN, GPIO_PULL_DISABLE); +} +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + unsigned char temp1 = (unsigned char)((cmd >> 8) & 0xFF); + unsigned char temp2 = (unsigned char)(cmd & 0xFF); + + lcm_util.send_data(0x2000 | temp1); + lcm_util.send_data(0x0000 | temp2); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(0x0004 | data); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100); + + MDELAY(200); + + send_ctrl_cmd(0xC000); send_data_cmd(0x86); + send_ctrl_cmd(0xC001); send_data_cmd(0x00); + send_ctrl_cmd(0xC002); send_data_cmd(0x86); + send_ctrl_cmd(0xC003); send_data_cmd(0x00); + send_ctrl_cmd(0xC100); send_data_cmd(0x45); + send_ctrl_cmd(0xC200); send_data_cmd(0x21); + send_ctrl_cmd(0xC202); send_data_cmd(0x02); + send_ctrl_cmd(0xB600); send_data_cmd(0x30); + send_ctrl_cmd(0xB602); send_data_cmd(0x30); + send_ctrl_cmd(0xC700); send_data_cmd(0x8F); + send_ctrl_cmd(0xE000); send_data_cmd(0x0E); + send_ctrl_cmd(0xE001); send_data_cmd(0x14); + + send_ctrl_cmd(0xE002); send_data_cmd(0x29); + send_ctrl_cmd(0xE003); send_data_cmd(0x3A); + send_ctrl_cmd(0xE004); send_data_cmd(0x1D); + send_ctrl_cmd(0xE005); send_data_cmd(0x30); + send_ctrl_cmd(0xE006); send_data_cmd(0x61); + send_ctrl_cmd(0xE007); send_data_cmd(0x3D); + send_ctrl_cmd(0xE008); send_data_cmd(0x22); + send_ctrl_cmd(0xE009); send_data_cmd(0x2A); + send_ctrl_cmd(0xE00A); send_data_cmd(0x87); + send_ctrl_cmd(0xE00B); send_data_cmd(0x16); + send_ctrl_cmd(0xE00C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE00D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE00E); send_data_cmd(0x78); + send_ctrl_cmd(0xE00F); send_data_cmd(0x96); + send_ctrl_cmd(0xE010); send_data_cmd(0x4A); + send_ctrl_cmd(0xE011); send_data_cmd(0x4D); + send_ctrl_cmd(0xE100); send_data_cmd(0x0E); + send_ctrl_cmd(0xE101); send_data_cmd(0x14); + send_ctrl_cmd(0xE102); send_data_cmd(0x29); + send_ctrl_cmd(0xE103); send_data_cmd(0x3A); + send_ctrl_cmd(0xE104); send_data_cmd(0x1D); + send_ctrl_cmd(0xE105); send_data_cmd(0x30); + send_ctrl_cmd(0xE106); send_data_cmd(0x61); + send_ctrl_cmd(0xE107); send_data_cmd(0x3F); + send_ctrl_cmd(0xE108); send_data_cmd(0x20); + send_ctrl_cmd(0xE109); send_data_cmd(0x26); + send_ctrl_cmd(0xE10A); send_data_cmd(0x83); + send_ctrl_cmd(0xE10B); send_data_cmd(0x16); + send_ctrl_cmd(0xE10C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE10D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE10E); send_data_cmd(0x78); + send_ctrl_cmd(0xE10F); send_data_cmd(0x96); + send_ctrl_cmd(0xE110); send_data_cmd(0x4A); + send_ctrl_cmd(0xE111); send_data_cmd(0x4D); + send_ctrl_cmd(0xE200); send_data_cmd(0x0E); + send_ctrl_cmd(0xE201); send_data_cmd(0x14); + send_ctrl_cmd(0xE202); send_data_cmd(0x29); + send_ctrl_cmd(0xE203); send_data_cmd(0x3A); + send_ctrl_cmd(0xE204); send_data_cmd(0x1D); + send_ctrl_cmd(0xE205); send_data_cmd(0x30); + send_ctrl_cmd(0xE206); send_data_cmd(0x61); + send_ctrl_cmd(0xE207); send_data_cmd(0x3D); + send_ctrl_cmd(0xE208); send_data_cmd(0x22); + send_ctrl_cmd(0xE209); send_data_cmd(0x2A); + send_ctrl_cmd(0xE20A); send_data_cmd(0x87); + send_ctrl_cmd(0xE20B); send_data_cmd(0x16); + send_ctrl_cmd(0xE20C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE20D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE20E); send_data_cmd(0x78); + send_ctrl_cmd(0xE20F); send_data_cmd(0x96); + send_ctrl_cmd(0xE210); send_data_cmd(0x4A); + send_ctrl_cmd(0xE211); send_data_cmd(0x4D); + send_ctrl_cmd(0xE300); send_data_cmd(0x0E); + send_ctrl_cmd(0xE301); send_data_cmd(0x14); + + send_ctrl_cmd(0xE302); send_data_cmd(0x29); + send_ctrl_cmd(0xE303); send_data_cmd(0x3A); + send_ctrl_cmd(0xE304); send_data_cmd(0x1D); + send_ctrl_cmd(0xE305); send_data_cmd(0x30); + send_ctrl_cmd(0xE306); send_data_cmd(0x61); + send_ctrl_cmd(0xE307); send_data_cmd(0x3F); + send_ctrl_cmd(0xE308); send_data_cmd(0x20); + send_ctrl_cmd(0xE309); send_data_cmd(0x26); + send_ctrl_cmd(0xE30A); send_data_cmd(0x83); + send_ctrl_cmd(0xE30B); send_data_cmd(0x16); + send_ctrl_cmd(0xE30C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE30D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE30E); send_data_cmd(0x78); + send_ctrl_cmd(0xE30F); send_data_cmd(0x96); + send_ctrl_cmd(0xE310); send_data_cmd(0x4A); + send_ctrl_cmd(0xE311); send_data_cmd(0x4D); + send_ctrl_cmd(0xE400); send_data_cmd(0x0E); + send_ctrl_cmd(0xE401); send_data_cmd(0x14); + send_ctrl_cmd(0xE402); send_data_cmd(0x29); + send_ctrl_cmd(0xE403); send_data_cmd(0x3A); + send_ctrl_cmd(0xE404); send_data_cmd(0x1D); + send_ctrl_cmd(0xE405); send_data_cmd(0x30); + send_ctrl_cmd(0xE406); send_data_cmd(0x61); + send_ctrl_cmd(0xE407); send_data_cmd(0x3D); + send_ctrl_cmd(0xE408); send_data_cmd(0x22); + send_ctrl_cmd(0xE409); send_data_cmd(0x2A); + send_ctrl_cmd(0xE40A); send_data_cmd(0x87); + send_ctrl_cmd(0xE40B); send_data_cmd(0x16); + send_ctrl_cmd(0xE40C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE40D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE40E); send_data_cmd(0x78); + send_ctrl_cmd(0xE40F); send_data_cmd(0x96); + send_ctrl_cmd(0xE410); send_data_cmd(0x4A); + send_ctrl_cmd(0xE411); send_data_cmd(0x4D); + send_ctrl_cmd(0xE500); send_data_cmd(0x0E); + send_ctrl_cmd(0xE501); send_data_cmd(0x14); + send_ctrl_cmd(0xE502); send_data_cmd(0x29); + send_ctrl_cmd(0xE503); send_data_cmd(0x3A); + send_ctrl_cmd(0xE504); send_data_cmd(0x1D); + send_ctrl_cmd(0xE505); send_data_cmd(0x30); + send_ctrl_cmd(0xE506); send_data_cmd(0x61); + send_ctrl_cmd(0xE507); send_data_cmd(0x3F); + send_ctrl_cmd(0xE508); send_data_cmd(0x20); + send_ctrl_cmd(0xE509); send_data_cmd(0x26); + send_ctrl_cmd(0xE50A); send_data_cmd(0x83); + + send_ctrl_cmd(0xE50B); send_data_cmd(0x16); + send_ctrl_cmd(0xE50C); send_data_cmd(0x3B); + send_ctrl_cmd(0xE50D); send_data_cmd(0x4C); + send_ctrl_cmd(0xE50E); send_data_cmd(0x78); + send_ctrl_cmd(0xE50F); send_data_cmd(0x96); + send_ctrl_cmd(0xE510); send_data_cmd(0x4A); + send_ctrl_cmd(0xE511); send_data_cmd(0x4D); + send_ctrl_cmd(0x2900); + + MDELAY(200); + + send_ctrl_cmd(0x2C00); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + /* serial host interface configurations */ + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_7M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_8BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_2MA; + + params->dbi.serial.cs_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_polarity = LCM_POLARITY_RISING; + params->dbi.serial.clk_phase = LCM_CLOCK_PHASE_0; + params->dbi.serial.is_non_dbi_mode = 1; + params->dbi.serial.clock_base = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.serial.clock_div = LCM_SERIAL_CLOCK_DIV_16; + /* RGB interface configurations */ + + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 50; + params->dpi.mipi_pll_clk_div2 = 13; + params->dpi.dpi_clk_div = 2; + params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = 10; + params->dpi.hsync_back_porch = 30; + params->dpi.hsync_front_porch = 30; + params->dpi.vsync_pulse_width = 10; + params->dpi.vsync_back_porch = 30; + params->dpi.vsync_front_porch = 30; + + params->dpi.format = LCM_DPI_FORMAT_RGB888; + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 2; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + config_gpio(); + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + config_gpio(); + send_ctrl_cmd(0x2800); + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + config_gpio(); + send_ctrl_cmd(0x1100); + MDELAY(200); + send_ctrl_cmd(0x2900); +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35582_lcm_drv = +{ + .name = "nt35582", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; diff --git a/cink_tinnoes73_gb/lcm/nt35582_mcu/nt35582_mcu.c b/cink_tinnoes73_gb/lcm/nt35582_mcu/nt35582_mcu.c new file mode 100755 index 0000000..2c7ff68 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/nt35582_mcu/nt35582_mcu.c @@ -0,0 +1,393 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (480) +#define FRAME_HEIGHT (800) +#define LCM_ID (0x5582) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data&0xff); +} + +static __inline unsigned short read_data_cmd(void) +{ + return (unsigned short)(lcm_util.read_data()); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + short x0, y0, x1, y1, x, y; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)0; + y0 = (short)0; + x1 = (short)FRAME_WIDTH-1; + y1 = (short)FRAME_HEIGHT-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x1100);//sleep out + MDELAY(200); + + set_lcm_register(0xC000,0x86);//power control PWCTR1 + set_lcm_register(0xC001,0x00); + set_lcm_register(0xC002,0x86); + set_lcm_register(0xC003,0x00); + set_lcm_register(0xC100,0x45); + set_lcm_register(0xC200,0x21); + set_lcm_register(0xC202,0x02); + set_lcm_register(0xB600,0x30);//SD_OP_SET + set_lcm_register(0xB602,0x30); + set_lcm_register(0xB100,0xA7);//wei zeng added + set_lcm_register(0xC700,0x8F);//vcom + set_lcm_register(0x3A00,0x05);//SET PIXEL_FORMAT,pre:0x55 + + + set_lcm_register(0xE000,0x0E);//gamma GMACTRL1 + set_lcm_register(0xE001,0x14); + set_lcm_register(0xE002,0x29); + set_lcm_register(0xE003,0x3A); + set_lcm_register(0xE004,0x1D); + set_lcm_register(0xE005,0x30); + set_lcm_register(0xE006,0x61); + set_lcm_register(0xE007,0x3D); + set_lcm_register(0xE008,0x22); + set_lcm_register(0xE009,0x2A); + set_lcm_register(0xE00A,0x87); + set_lcm_register(0xE00B,0x16); + set_lcm_register(0xE00C,0x3B); + set_lcm_register(0xE00D,0x4C); + set_lcm_register(0xE00E,0x78); + set_lcm_register(0xE00F,0x96); + set_lcm_register(0xE010,0x4A); + set_lcm_register(0xE011,0x4D); + + set_lcm_register(0xE100,0x0E);//GMACTRL2 + set_lcm_register(0xE101,0x14); + set_lcm_register(0xE102,0x29); + set_lcm_register(0xE103,0x3A); + set_lcm_register(0xE104,0x1D); + set_lcm_register(0xE105,0x30); + set_lcm_register(0xE106,0x61); + set_lcm_register(0xE107,0x3F); + set_lcm_register(0xE108,0x20); + set_lcm_register(0xE109,0x26); + set_lcm_register(0xE10A,0x83); + set_lcm_register(0xE10B,0x16); + set_lcm_register(0xE10C,0x3B); + set_lcm_register(0xE10D,0x4C); + set_lcm_register(0xE10E,0x78); + set_lcm_register(0xE10F,0x96); + set_lcm_register(0xE110,0x4A); + set_lcm_register(0xE111,0x4D); + + set_lcm_register(0xE200,0x0E);//GMACTRL3 + set_lcm_register(0xE201,0x14); + set_lcm_register(0xE202,0x29); + set_lcm_register(0xE203,0x3A); + set_lcm_register(0xE204,0x1D); + set_lcm_register(0xE205,0x30); + set_lcm_register(0xE206,0x61); + set_lcm_register(0xE207,0x3D); + set_lcm_register(0xE208,0x22); + set_lcm_register(0xE209,0x2A); + set_lcm_register(0xE20A,0x87); + set_lcm_register(0xE20B,0x16); + set_lcm_register(0xE20C,0x3B); + set_lcm_register(0xE20D,0x4C); + set_lcm_register(0xE20E,0x78); + set_lcm_register(0xE20F,0x96); + set_lcm_register(0xE210,0x4A); + set_lcm_register(0xE211,0x4D); + + + set_lcm_register(0xE300,0x0E);//GMACTRL4 + set_lcm_register(0xE301,0x14); + set_lcm_register(0xE302,0x29); + set_lcm_register(0xE303,0x3A); + set_lcm_register(0xE304,0x1D); + set_lcm_register(0xE305,0x30); + set_lcm_register(0xE306,0x61); + set_lcm_register(0xE307,0x3F); + set_lcm_register(0xE308,0x20); + set_lcm_register(0xE309,0x26); + set_lcm_register(0xE30A,0x83); + set_lcm_register(0xE30B,0x16); + set_lcm_register(0xE30C,0x3B); + set_lcm_register(0xE30D,0x4C); + set_lcm_register(0xE30E,0x78); + set_lcm_register(0xE30F,0x96); + set_lcm_register(0xE310,0x4A); + set_lcm_register(0xE311,0x4D); + + set_lcm_register(0xE400,0x0E);//GMACTRL5 + set_lcm_register(0xE401,0x14); + set_lcm_register(0xE402,0x29); + set_lcm_register(0xE403,0x3A); + set_lcm_register(0xE404,0x1D); + set_lcm_register(0xE405,0x30); + set_lcm_register(0xE406,0x61); + set_lcm_register(0xE407,0x3D); + set_lcm_register(0xE408,0x22); + set_lcm_register(0xE409,0x2A); + set_lcm_register(0xE40A,0x87); + set_lcm_register(0xE40B,0x16); + set_lcm_register(0xE40C,0x3B); + set_lcm_register(0xE40D,0x4C); + set_lcm_register(0xE40E,0x78); + set_lcm_register(0xE40F,0x96); + set_lcm_register(0xE410,0x4A); + set_lcm_register(0xE411,0x4D); + + + set_lcm_register(0xE500,0x0E); + set_lcm_register(0xE501,0x14); + set_lcm_register(0xE502,0x29); + set_lcm_register(0xE503,0x3A); + set_lcm_register(0xE504,0x1D); + set_lcm_register(0xE505,0x30); + set_lcm_register(0xE506,0x61); + set_lcm_register(0xE507,0x3F); + set_lcm_register(0xE508,0x20); + set_lcm_register(0xE509,0x26); + set_lcm_register(0xE50A,0x83); + set_lcm_register(0xE50B,0x16); + set_lcm_register(0xE50C,0x3B); + set_lcm_register(0xE50D,0x4C); + set_lcm_register(0xE50E,0x78); + set_lcm_register(0xE50F,0x96); + set_lcm_register(0xE510,0x4A); + set_lcm_register(0xE511,0x4D); + + // enable tering free + set_lcm_register(0x3500,0x02); + + set_lcm_register(0x3600,0x00); + send_ctrl_cmd(0x2900); + MDELAY(200); + send_ctrl_cmd(0x2C00);//wei zeng + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 3; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 0; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 3; + params->dbi.parallel.read_latency = 15; + params->dbi.parallel.wait_period = 1; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(25); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x1000); + MDELAY(20); +} + + +static void lcm_resume(void) +{ + send_ctrl_cmd(0x1100); + MDELAY(200); + + // xuecheng, do we need to write 0x2900?? + send_ctrl_cmd(0x2900); +} + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + short x0, y0, x1, y1; + short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end; + + + x0 = (short)x; + y0 = (short)y; + x1 = (short)x+width-1; + y1 = (short)y+height-1; + + h_X_start=((x0&0x0300)>>8); + l_X_start=(x0&0x00FF); + h_X_end=((x1&0x0300)>>8); + l_X_end=(x1&0x00FF); + + h_Y_start=((y0&0x0300)>>8); + l_Y_start=(y0&0x00FF); + h_Y_end=((y1&0x0300)>>8); + l_Y_end=(y1&0x00FF); + + send_ctrl_cmd( 0x2A00 ); + send_data_cmd( h_X_start); + send_ctrl_cmd( 0x2A01 ); + send_data_cmd( l_X_start); + send_ctrl_cmd( 0x2A02); + send_data_cmd( h_X_end ); + send_ctrl_cmd( 0x2A03); + send_data_cmd( l_X_end ); + send_ctrl_cmd( 0x2B00 ); + send_data_cmd( h_Y_start); + send_ctrl_cmd( 0x2B01 ); + send_data_cmd( l_Y_start); + send_ctrl_cmd( 0x2B02); + send_data_cmd( h_Y_end ); + send_ctrl_cmd( 0x2B03); + send_data_cmd( l_Y_end ); + send_ctrl_cmd(0x3601); //enable HSM mode + send_data_cmd(0x01); + send_ctrl_cmd( 0x2C00 ); +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + + send_ctrl_cmd(0x1180); + id = read_data_cmd(); + +#if defined(BUILD_UBOOT) + printf("%s, id1 = 0x%08x\n", __func__, id); +#endif + + send_ctrl_cmd(0x1080); + id |= (read_data_cmd() << 8); + +#if defined(BUILD_UBOOT) + printf("%s, id2 = 0x%08x\n", __func__, id); +#endif + + return (LCM_ID == id)?1:0; +} + +LCM_DRIVER nt35582_mcu_lcm_drv = +{ + .name = "nt35582_mcu", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_tinnoes73_gb/lcm/s6d0170/s6d0170.c b/cink_tinnoes73_gb/lcm/s6d0170/s6d0170.c new file mode 100755 index 0000000..4c63ca9 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/s6d0170/s6d0170.c @@ -0,0 +1,302 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x0170) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + send_ctrl_cmd(0x2300); + + /* Power Supply Setting */ + set_lcm_register(0x11, 0x0000); + set_lcm_register(0x12, 0x0000); + set_lcm_register(0x13, 0x0000); + set_lcm_register(0x14, 0x0000); + UDELAY(10); + + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x12, 0x3222); + set_lcm_register(0x13, 0x204E); + set_lcm_register(0x14, 0x0248); + set_lcm_register(0x10, 0x0700); + UDELAY(10); + + set_lcm_register(0x11, 0x0112); + UDELAY(10); + + set_lcm_register(0x11, 0x0312); + UDELAY(10); + + set_lcm_register(0x11, 0x0712); + UDELAY(10); + + set_lcm_register(0x11, 0x0F1B); + UDELAY(10); + + set_lcm_register(0x11, 0x0F3B); + UDELAY(30); + + /* Display Contron Register Setup */ + set_lcm_register(0x01, 0x0136); + set_lcm_register(0x02, 0x0000); + set_lcm_register(0x03, 0x9000); + set_lcm_register(0x07, 0x0104); + set_lcm_register(0x08, 0x00E2); + set_lcm_register(0x0B, 0x1100); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0F, 0x0001); // OSC. freq. + UDELAY(40); + + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x46, 0x00EF); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x48, 0x01AF); + set_lcm_register(0x49, 0x0000); + + // Gamma (R) + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x030c); + set_lcm_register(0x52, 0x0801); + set_lcm_register(0x53, 0x0109); + set_lcm_register(0x54, 0x0b01); + set_lcm_register(0x55, 0x0200); + set_lcm_register(0x56, 0x020d); + set_lcm_register(0x57, 0x0e00); + set_lcm_register(0x58, 0x0002); + set_lcm_register(0x59, 0x010b); + + // Gamma (G) + set_lcm_register(0x60, 0x0B00); + set_lcm_register(0x61, 0x000D); + set_lcm_register(0x62, 0x0000); + set_lcm_register(0x63, 0x0002); + set_lcm_register(0x64, 0x0604); + set_lcm_register(0x65, 0x0000); + set_lcm_register(0x66, 0x000C); + set_lcm_register(0x67, 0x060F); + set_lcm_register(0x68, 0x0F0F); + set_lcm_register(0x69, 0x0A06); + + // Gamma (B) + set_lcm_register(0x70, 0x0B00); + set_lcm_register(0x71, 0x000D); + set_lcm_register(0x72, 0x0000); + set_lcm_register(0x73, 0x0002); + set_lcm_register(0x74, 0x0604); + set_lcm_register(0x75, 0x0000); + set_lcm_register(0x76, 0x000C); + set_lcm_register(0x77, 0x060F); + set_lcm_register(0x78, 0x0F0F); + set_lcm_register(0x79, 0x0A06); + set_lcm_register(0x80, 0x0101); + + // Display Sequence + set_lcm_register(0x07, 0x0116); + UDELAY(40); + set_lcm_register(0x07, 0x1117); + + set_lcm_register(0x13, 0x2055); + + // Power Control 1(R10h) + // SAP: Fast DSTB1F: Off DSTB: Off STB: Off + set_lcm_register(0x10, 0x0700); + + // Blank Period Control(R08h) + // FP: 2 BP: 2 + set_lcm_register(0x08, 0x0022); + + // Frame Cycle Control(R0Bh) + // NO: 2 INCLK SDT: 2 INCLK DIV: fosc/1 RTN: 17 INCLK + set_lcm_register(0x0B, 0x2201); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 1; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + UDELAY(15); + set_lcm_register(0x07, 0x0110); + UDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ + set_lcm_register(0x10, 0x0700); + UDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + UDELAY(1); + set_lcm_register(0x11, 0x0112); + UDELAY(1); + set_lcm_register(0x11, 0x0312); + UDELAY(1); + set_lcm_register(0x11, 0x0712); + UDELAY(1); + set_lcm_register(0x11, 0x0F1B); + UDELAY(1); + set_lcm_register(0x11, 0x0F3B); + UDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + UDELAY(15); + set_lcm_register(0x07, 0x1117); + UDELAY(150); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x46, x1); + set_lcm_register(0x47, x0); + set_lcm_register(0x48, y1); + set_lcm_register(0x49, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x2300); + + send_ctrl_cmd(0x05); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER s6d0170_lcm_drv = +{ + .name = "s6d0170", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_tinnoes73_gb/lcm/spfd5461a/spfd5461a.c b/cink_tinnoes73_gb/lcm/spfd5461a/spfd5461a.c new file mode 100755 index 0000000..9345227 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/spfd5461a/spfd5461a.c @@ -0,0 +1,350 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (240) +#define FRAME_HEIGHT (320) +#define LCM_ID (0x5408) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (1) +#define POWER_ON_SEQ_DELAY (1) + + +// --------------------------------------------------------------------------- +// Forward Declarations +// --------------------------------------------------------------------------- + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x, y; + + lcm_update(0, 0, FRAME_WIDTH, FRAME_HEIGHT); + + for (y = 0; y < FRAME_HEIGHT; ++ y) { + for (x = 0; x < FRAME_WIDTH; ++ x) { + lcm_util.send_data(color); + } + } +} + +static void init_lcm_registers(void) +{ + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x1030); + set_lcm_register(0x02, 0x0700); + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); // FMARK function + + set_lcm_register(0x0C, 0x0000); // MCU interface setting + set_lcm_register(0x0D, 0x0000); // Frame marker Position + set_lcm_register(0x0F, 0x0000); // MCU interface polarity + + set_lcm_register(0x07, 0x0101); + + // ----------- Power On sequence ----------- + + set_lcm_register(0x10, 0x10B0); // SAP, BT[3:0], AP, DSTB, SLP, STB + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x17, 0x0001); + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x12, 0x01B9); // VREG1OUT voltage + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x13, 0x0A00); // VDV[4:0] for VCOM amplitude + MDELAY(POWER_ON_SEQ_DELAY); + set_lcm_register(0x29, 0x0006); // VCM[4:0] for VCOMH + MDELAY(POWER_ON_SEQ_DELAY); + + // ----------- Adjust the Gamma Curve ----------- + + set_lcm_register(0x30, 0x0002); + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3f10); + set_lcm_register(0x34, 0x3d06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0b02); + set_lcm_register(0x3C, 0x040f); + set_lcm_register(0x3D, 0x050c); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); + + // ----------- Set GRAM area ----------- + + set_lcm_register(0x50, 0x0000); // Horizontal GRAM Start Address + set_lcm_register(0x51, 0x00EF); // Horizontal GRAM End Address + set_lcm_register(0x52, 0x0000); // Vertical GRAM Start Address + set_lcm_register(0x53, 0x013F); // Vertical GRAM Start Address + + + set_lcm_register(0x60, 0x2700); // Gate Scan Line + set_lcm_register(0x61, 0x0001); // NDL,VLE, REV + set_lcm_register(0x6A, 0x0000); // set scrolling line + + // ----------- Partial Display Control ----------- + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + // ----------- Panel Control ----------- + + set_lcm_register(0x90, 0x0010); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); + + set_lcm_register(0x07, 0x0173); + MDELAY(PANEL_CONTROL_DELAY); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 3; + params->dbi.parallel.write_wait = 3; + params->dbi.parallel.read_setup = 2; + params->dbi.parallel.read_latency = 19; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(2); + SET_RESET_PIN(1); + MDELAY(2); + + init_lcm_registers(); + sw_clear_panel(0x0); // clean screen as all black +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x00, 0x0000); + set_lcm_register(0x01, 0x0100); + set_lcm_register(0x03, 0x10B0); + set_lcm_register(0x02, 0x0700); // set N_line inversion + + set_lcm_register(0x04, 0x0000); + set_lcm_register(0x08, 0x0207); + set_lcm_register(0x09, 0x0000); + set_lcm_register(0x0A, 0x0000); + set_lcm_register(0x0C, 0x0000); + set_lcm_register(0x0D, 0x0000); + set_lcm_register(0x0F, 0x0000); + set_lcm_register(0x07, 0x0101); + + set_lcm_register(0x10, 0x10B0); // 0x12B0 power control start + MDELAY(0x20); // delay 20ms for voltage setup + set_lcm_register(0x11, 0x0007); + MDELAY(0x20); + set_lcm_register(0x17, 0x0001); + MDELAY(0x20); + set_lcm_register(0x12, 0x01B9); // 0x01BD + MDELAY(0x20); + set_lcm_register(0x13, 0x0A00); // 0x1800 + MDELAY(0x20); + set_lcm_register(0x29, 0x0008); // 0x0019 power control end + MDELAY(0x20); + + set_lcm_register(0x30, 0x0002); // Gamma 2.4 start + set_lcm_register(0x31, 0x0720); + set_lcm_register(0x32, 0x0924); + set_lcm_register(0x33, 0x3F10); + set_lcm_register(0x34, 0x3D06); + set_lcm_register(0x35, 0x1003); + set_lcm_register(0x36, 0x0507); + set_lcm_register(0x37, 0x0411); + set_lcm_register(0x38, 0x0005); + set_lcm_register(0x39, 0x0003); + set_lcm_register(0x3A, 0x0805); + set_lcm_register(0x3B, 0x0B02); + set_lcm_register(0x3C, 0x040F); + set_lcm_register(0x3D, 0x050C); + set_lcm_register(0x3E, 0x0103); + set_lcm_register(0x3F, 0x0401); // Gamma 2.4 end + + set_lcm_register(0x50, 0x0000); + set_lcm_register(0x51, 0x00EF); + set_lcm_register(0x52, 0x0000); + set_lcm_register(0x53, 0x013F); + + set_lcm_register(0x60, 0x2700); + set_lcm_register(0x61, 0x0001); + set_lcm_register(0x6A, 0x0000); + + set_lcm_register(0x80, 0x0000); + set_lcm_register(0x81, 0x0000); + set_lcm_register(0x82, 0x0000); + set_lcm_register(0x83, 0x0000); + set_lcm_register(0x84, 0x0000); + set_lcm_register(0x85, 0x0000); + + set_lcm_register(0x90, 0x0012); + set_lcm_register(0x92, 0x0000); + set_lcm_register(0x93, 0x0103); + set_lcm_register(0x95, 0x0110); + set_lcm_register(0x97, 0x0000); + set_lcm_register(0x98, 0x0000); + + set_lcm_register(0xF0, 0x5408); + set_lcm_register(0xF2, 0x00DF); // green, blue point CR + set_lcm_register(0xF3, 0x0007); + set_lcm_register(0xF4, 0x001F); + set_lcm_register(0xF0, 0x0000); +#endif + set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x50, x0); + set_lcm_register(0x51, x1); + set_lcm_register(0x52, y0); + set_lcm_register(0x53, y1); + set_lcm_register(0x20, x0); + set_lcm_register(0x21, y0); + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER spfd5461a_lcm_drv = +{ + .name = "spfd5461a", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_tinnoes73_gb/lcm/ta7601/ta7601.c b/cink_tinnoes73_gb/lcm/ta7601/ta7601.c new file mode 100755 index 0000000..9877792 --- /dev/null +++ b/cink_tinnoes73_gb/lcm/ta7601/ta7601.c @@ -0,0 +1,283 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x7601) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int to_18_bit_inst_format(unsigned int val) +{ + return ((val & 0xFF00) << 2) | + ((val & 0x00FF) << 1); +} + +static __inline unsigned int to_16_bit_inst_format(unsigned int val) +{ + return (((val >> 2) & 0xFF00) | + ((val >> 1) & 0x00FF)); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(to_18_bit_inst_format(cmd)); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(to_18_bit_inst_format(data)); +} + +static __inline unsigned int read_data_cmd(void) +{ + unsigned int data; + data = to_16_bit_inst_format(lcm_util.read_data()); + return data; +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + + +static void init_lcm_registers(void) +{ + // 0113 HVGA fifi + // 20080814 REVISED IC + set_lcm_register(0x01, 0x003C); + set_lcm_register(0x02, 0x0100); + set_lcm_register(0x03, 0x1020); // 1020 + + // set smlc function + set_lcm_register(0x67, 0x0200); + set_lcm_register(0x04, 0x0000); // turn off backlight control signal + // WMLCDDATA(0x0000);//TURN OFF THE CABC ILED=14.32ma + set_lcm_register(0x05, 0x0002); // cabc frequency 8.4k--20khz + set_lcm_register(0x48, 0x4b90); + set_lcm_register(0x49, 0x95a0); + set_lcm_register(0x4a, 0xa0ac); + set_lcm_register(0x4b, 0xb5ce); + // end smlc function + + set_lcm_register(0x08, 0x0808); + set_lcm_register(0x0A, 0x0700); // pre:0x0500 + set_lcm_register(0x0B, 0x0000); + set_lcm_register(0x0C, 0x0770); + set_lcm_register(0x0D, 0x0000); + //set_lcm_register(0x0E, 0x0080); // pre:0x0040 + set_lcm_register(0x0E, 0x003F); // pre:0x0040 //fifi + + set_lcm_register(0x11, 0x0406); + set_lcm_register(0x12, 0x000E); + MDELAY(20); + + set_lcm_register(0x13, 0x0222); + set_lcm_register(0x14, 0x0015); + set_lcm_register(0x15, 0x4277); + set_lcm_register(0x16, 0x0000); + + // GAMMA + set_lcm_register(0x30, 0x5a50); // red gamma + set_lcm_register(0x31, 0x00c8); + set_lcm_register(0x32, 0xc7be); + set_lcm_register(0x33, 0x0003); + set_lcm_register(0x36, 0x3443); + set_lcm_register(0x3B, 0x0000); + set_lcm_register(0x3C, 0x0000); + + set_lcm_register(0x2C, 0x5a50); // green gamma + set_lcm_register(0x2D, 0x00c8); + set_lcm_register(0x2E, 0xc7be); + set_lcm_register(0x2F, 0x0003); + set_lcm_register(0x35, 0x3443); + set_lcm_register(0x39, 0x0000); + set_lcm_register(0x3A, 0x0000); + + set_lcm_register(0x28, 0x5a50); // blue gamma + set_lcm_register(0x29, 0x00c8); + set_lcm_register(0x2A, 0xc7be); + set_lcm_register(0x2B, 0x0003); + set_lcm_register(0x34, 0x3443); + set_lcm_register(0x37, 0x0000); + set_lcm_register(0x38, 0x0000); + + set_lcm_register(0x12, 0x200E); + MDELAY(20); + set_lcm_register(0x12, 0x2003); + MDELAY(20); + + set_lcm_register(0x44, 0x013f); + set_lcm_register(0x45, 0x0000); + set_lcm_register(0x46, 0x01df); + set_lcm_register(0x47, 0x0000); + set_lcm_register(0x20, 0x0000); + set_lcm_register(0x21, 0x013f); // 013F + set_lcm_register(0x07, 0x0012); + MDELAY(40); + set_lcm_register(0x07, 0x0017); + set_lcm_register(0x22, 0xFFFF); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = 0; + + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 4; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 11; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + + init_lcm_registers(); +} + + +static void lcm_suspend(void) +{ + set_lcm_register(0x15, 0x0000); + set_lcm_register(0x07, 0x0112); + MDELAY(15); + set_lcm_register(0x07, 0x0110); + MDELAY(15); + set_lcm_register(0x10, 0x0701); +} + + +static void lcm_resume(void) +{ +#if 0 + set_lcm_register(0x10, 0x0700); + MDELAY(15); + set_lcm_register(0x11, 0x0010); + set_lcm_register(0x14, 0x1f56); + set_lcm_register(0x10, 0x0700); + MDELAY(1); + set_lcm_register(0x11, 0x0112); + MDELAY(1); + set_lcm_register(0x11, 0x0312); + MDELAY(1); + set_lcm_register(0x11, 0x0712); + MDELAY(1); + set_lcm_register(0x11, 0x0F1B); + MDELAY(1); + set_lcm_register(0x11, 0x0F3B); + MDELAY(3); + set_lcm_register(0x15, 0x0031); + set_lcm_register(0x07, 0x1116); + MDELAY(15); + set_lcm_register(0x07, 0x1117); +#elif 1 + /* FIXME: above wakup sequence does NOT work, + workaround by reinit LCM + */ + SET_RESET_PIN(0); + MDELAY(100); + SET_RESET_PIN(1); + MDELAY(500); + init_lcm_registers(); +#endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x44, x1); // end x + set_lcm_register(0x45, x0); // start x + set_lcm_register(0x46, y1); // end y + set_lcm_register(0x47, y0); // start y + + set_lcm_register(0x20, y0); // start y + set_lcm_register(0x21, x1); // end x + + send_ctrl_cmd(0x22); +} + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- + +LCM_DRIVER ta7601_lcm_drv = +{ + .name = "ta7601", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id, +}; diff --git a/cink_tinnoes73_gb/lcm/tft1p3037/tft1p3037.c b/cink_tinnoes73_gb/lcm/tft1p3037/tft1p3037.c new file mode 100755 index 0000000..4a2dffd --- /dev/null +++ b/cink_tinnoes73_gb/lcm/tft1p3037/tft1p3037.c @@ -0,0 +1,314 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (480) +#define LCM_ID (0x8194) +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int HIGH_BYTE(unsigned int val) +{ + return (val >> 8) & 0xFF; +} + +static __inline unsigned int LOW_BYTE(unsigned int val) +{ + return (val & 0xFF); +} + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd & 0xFF); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data & 0xFF); +} + +static __inline unsigned int read_data_cmd(void) +{ + return lcm_util.read_data(); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd(regIndex); + send_data_cmd(regData); +} + +static void sw_clear_panel(unsigned int color) +{ + unsigned int x0 = 0; + unsigned int y0 = 0; + unsigned int x1 = x0 + FRAME_WIDTH - 1; + unsigned int y1 = y0 + FRAME_HEIGHT - 1; + + unsigned int x, y; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set + + // 18-bit mode (256K color) coding + for (y = y0; y <= y1; ++ y) { + for (x = x0; x <= x1; ++ x) { + lcm_util.send_data(color); + } + } +} + + +static void init_lcm_registers(void) +{ + // FROM 9K0804 + send_ctrl_cmd(0X0011); + MDELAY(20); + + send_ctrl_cmd(0X00D0); // Power_Setting (D0h) + send_data_cmd(0X0007); + send_data_cmd(0X0042); + send_data_cmd(0X001B); + send_ctrl_cmd(0X00D1); // VCOM Control (D1h) + send_data_cmd(0X0000); + send_data_cmd(0X0025); + send_data_cmd(0X0012); + send_ctrl_cmd(0X00D2); // Power_Setting for Normal Mode + send_data_cmd(0X0001); + send_data_cmd(0X0011); + send_ctrl_cmd(0X00C0); // Panel Driving Setting (C0h) + send_data_cmd(0X0010); + send_data_cmd(0X003B); + send_data_cmd(0X0000); + send_data_cmd(0X0012); + send_data_cmd(0X0001); + send_ctrl_cmd(0X00C1); + send_data_cmd(0X0010); + send_data_cmd(0X0013); + send_data_cmd(0X0088); + // xuecheng, lcm fps setting + // 0x001 for 125hz + send_ctrl_cmd(0X00C5); + send_data_cmd(0X0000); + + send_ctrl_cmd(0X00C8); + send_data_cmd(0X0002); + send_data_cmd(0X0046); + send_data_cmd(0X0014); + send_data_cmd(0X0031); + send_data_cmd(0X000A); + send_data_cmd(0X0004); + send_data_cmd(0X0037); + send_data_cmd(0X0024); + send_data_cmd(0X0057); + send_data_cmd(0X0013); + send_data_cmd(0X0006); + send_data_cmd(0X000C); + send_ctrl_cmd(0X0036); + send_data_cmd(0X000A); + send_ctrl_cmd(0X003A); + send_data_cmd(0X0005); + send_ctrl_cmd(0X002A); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X003F); + send_ctrl_cmd(0X002B); + send_data_cmd(0X0000); + send_data_cmd(0X0000); + send_data_cmd(0X0001); + send_data_cmd(0X00DF); + MDELAY(120); + + send_ctrl_cmd(0X0029); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 1; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_104M; + params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_LSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS; + params->dbi.io_driving_current = 0; + + +#if 0 + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; +#else + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + params->dbi.te_hs_delay_cnt = 25; + params->dbi.te_vs_width_cnt = 223; + params->dbi.te_vs_width_cnt_div = LCM_DBI_TE_VS_WIDTH_CNT_DIV_16; +#endif + + + params->dbi.parallel.write_setup = 0; + params->dbi.parallel.write_hold = 2; + params->dbi.parallel.write_wait = 2; + params->dbi.parallel.read_setup = 0; + params->dbi.parallel.read_latency = 9; + params->dbi.parallel.wait_period = 0; +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(40); + SET_RESET_PIN(1); + MDELAY(100); + + init_lcm_registers(); + + send_ctrl_cmd(0X0035); // Enable Tearing Control Signal + send_data_cmd(0X0000); // Set as mode 1 + + send_ctrl_cmd(0X0044); // Set TE signal delay scanline + send_data_cmd(0X0000); // Set as 0-th scanline + send_data_cmd(0X0000); + + sw_clear_panel(0x0); // Clean panel as black +} + + +static void lcm_suspend(void) +{ + send_ctrl_cmd(0x28); + +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x05); + send_data_cmd(0x47); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x10); + MDELAY(10); +} + + +static void lcm_resume(void) +{ +#if 1 + // truely's patch for BT UART noise issue + send_ctrl_cmd(0xD0); + send_data_cmd(0x07); + send_data_cmd(0x42); + send_data_cmd(0x1D); + MDELAY(200); +#endif + + send_ctrl_cmd(0x11); + MDELAY(120); + send_ctrl_cmd(0x29); + MDELAY(100); // wait for LCM is stable to show +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + send_ctrl_cmd(0x2A); + send_data_cmd(HIGH_BYTE(x0)); + send_data_cmd(LOW_BYTE(x0)); + send_data_cmd(HIGH_BYTE(x1)); + send_data_cmd(LOW_BYTE(x1)); + + send_ctrl_cmd(0x2B); + send_data_cmd(HIGH_BYTE(y0)); + send_data_cmd(LOW_BYTE(y0)); + send_data_cmd(HIGH_BYTE(y1)); + send_data_cmd(LOW_BYTE(y1)); + + send_ctrl_cmd(0x2C); // send DDRAM set +} + +static unsigned int lcm_compare_id(void) +{ + unsigned int id = 0; + send_ctrl_cmd(0xBF); + read_data_cmd();//dummy code:0 + read_data_cmd();//MIPI:0x2 + read_data_cmd();//MIPI:0x4 + id = read_data_cmd();//should 0x94 + id |= read_data_cmd() << 8;//should 0x81 + read_data_cmd();//0xFF + return (LCM_ID == id)?1:0; +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER tft1p3037_lcm_drv = +{ + .name = "tft1p3037", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/cink_tinnoes73_gb/lcm/zte6516/zte6516.c b/cink_tinnoes73_gb/lcm/zte6516/zte6516.c new file mode 100755 index 0000000..6413dfe --- /dev/null +++ b/cink_tinnoes73_gb/lcm/zte6516/zte6516.c @@ -0,0 +1,312 @@ +#include + +#include "lcm_drv.h" + + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (320) +#define FRAME_HEIGHT (240) +#define LCM_ID (0x57) +// --------------------------------------------------------------------------- +// Local Variables: +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#define PANEL_CONTROL_DELAY (10) +#define POWER_ON_SEQ_DELAY (200) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline unsigned int LOW_BYTE(unsigned int x) +{ + return (x & 0xFF); +} + +static __inline unsigned int HIGH_BYTE(unsigned int x) +{ + return ((x >> 8) & 0xFF); +} + + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + lcm_util.send_cmd(cmd); +} + +static __inline void send_data_cmd(unsigned int data) +{ + lcm_util.send_data(data); +} + +static __inline unsigned int read_data_cmd(void) +{ + return 0x00FF & (lcm_util.read_data() >> 1); +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + send_ctrl_cmd((regIndex & 0x00FF) << 1); + send_data_cmd((regData & 0x00FF) << 1); +} + + +static void init_lcm_registers(void) +{ + + + //=======wenbo add============== + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x0072, 0x00F6); + set_lcm_register(0x00FF, 0x0000); + set_lcm_register(0x00F2, 0x0000); + set_lcm_register(0x00E4, 0x0000); + set_lcm_register(0x00E5, 0x001C); + set_lcm_register(0x00E6, 0x0000); + set_lcm_register(0x00E7, 0x001C); + set_lcm_register(0x00EE, 0x0042); + set_lcm_register(0x00EF, 0x00DB); + set_lcm_register(0x002E, 0x0098); + set_lcm_register(0x0040, 0x0000); + set_lcm_register(0x0041, 0x002E); + set_lcm_register(0x0042, 0x002D); + set_lcm_register(0x0043, 0x003F); + set_lcm_register(0x0044, 0x003F); + set_lcm_register(0x0045, 0x003F); + set_lcm_register(0x0046, 0x002C); + set_lcm_register(0x0047, 0x007F); + set_lcm_register(0x0048, 0x0007); + set_lcm_register(0x0049, 0x0005); + set_lcm_register(0x004A, 0x0008); + set_lcm_register(0x004B, 0x0013); + set_lcm_register(0x004C, 0x001E); + set_lcm_register(0x0050, 0x0000); + set_lcm_register(0x0051, 0x0000); + set_lcm_register(0x0052, 0x0000); + set_lcm_register(0x0053, 0x0012); + set_lcm_register(0x0054, 0x0011); + set_lcm_register(0x0055, 0x003F); + set_lcm_register(0x0056, 0x0000); + set_lcm_register(0x0057, 0x0053); + set_lcm_register(0x0058, 0x0001); + set_lcm_register(0x0059, 0x000C); + set_lcm_register(0x005A, 0x0017); + set_lcm_register(0x005B, 0x001A); + set_lcm_register(0x005C, 0x0018); + set_lcm_register(0x005D, 0x00C3); + set_lcm_register(0x0002, 0x0000); + set_lcm_register(0x0003, 0x0000); + set_lcm_register(0x0004, 0x0001); + set_lcm_register(0x0005, 0x003F); + set_lcm_register(0x0006, 0x0000); + set_lcm_register(0x0007, 0x0000); + set_lcm_register(0x0008, 0x0000); + set_lcm_register(0x0009, 0x00EF); // + set_lcm_register(0x0024, 0x0022); + set_lcm_register(0x0025, 0x0064); + set_lcm_register(0x0023, 0x0090); + set_lcm_register(0x001B, 0x000E); + set_lcm_register(0x001D, 0x0011); + set_lcm_register(0x0019, 0x0001); + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x0001, 0x0000); + set_lcm_register(0x001F, 0x0080); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x0090); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x001F, 0x00D4); + MDELAY(5); //DELAY 5MS + set_lcm_register(0x0028, 0x0008); + MDELAY(40); + set_lcm_register(0x0028, 0x0038); + MDELAY(40); //DELAY 40MS + set_lcm_register(0x0028, 0x003C); + //wr_com(0x0016, 0x0020); //0020 + set_lcm_register(0x0017, 0x0006); //18bit + send_ctrl_cmd(0x0022 << 1); + //===========wenbo add end========= + + +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DBI; + params->ctrl = LCM_CTRL_PARALLEL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dbi.port = 0; + params->dbi.clock_freq = LCM_DBI_CLOCK_FREQ_52M; //LCM_DBI_CLOCK_FREQ_52M + params->dbi.data_width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST; + params->dbi.data_format.padding = LCM_DBI_PADDING_ON_MSB; + params->dbi.data_format.format = LCM_DBI_FORMAT_RGB666; + params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_18BITS; + params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_32_BITS; + params->dbi.io_driving_current = LCM_DRIVING_CURRENT_8MA; + + params->dbi.parallel.write_setup = 2;//1; //0 + params->dbi.parallel.write_hold = 1; ////3 33 + params->dbi.parallel.write_wait = 3; //3// + params->dbi.parallel.read_setup = 0; ////2 + params->dbi.parallel.read_latency = 10; ////19 + params->dbi.parallel.wait_period = 0; ////0 +} + + +static void lcm_init(void) +{ + SET_RESET_PIN(0); + MDELAY(10); + SET_RESET_PIN(1); + MDELAY(50); + + init_lcm_registers(); +} + + + static void lcm_suspend(void) + { + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0004); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0000); + + set_lcm_register(0x001F, 0x0089); + + set_lcm_register(0x0019, 0x0000); + + + /* set_lcm_register(0x07, 0x0101); + MDELAY(10); + set_lcm_register(0x07, 0x0000); // display off + MDELAY(10); + set_lcm_register(0x10, 0x10B2); + MDELAY(50); + */ + } + + + +static void lcm_resume(void) + { + + set_lcm_register(0x00FF, 0x0000); + + set_lcm_register(0x0019, 0x0001); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0088); + + set_lcm_register(0x001C, 0x0003); + set_lcm_register(0x001F, 0x0080); + + MDELAY(5); + + set_lcm_register(0x001F, 0x0090); + + MDELAY(5); + + set_lcm_register(0x001F, 0x00D4); + + MDELAY(5); + + set_lcm_register(0x0028, 0x0008); + + MDELAY(40); + + set_lcm_register(0x0028, 0x0038); + + MDELAY(40); + + set_lcm_register(0x0028, 0x003C); + + /* set_lcm_register(0x10, 0x10B0); + MDELAY(25); + set_lcm_register(0x07, 0x0173); + MDELAY(175); + */ + } + + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) + { + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + set_lcm_register(0x02, HIGH_BYTE(x0)); + set_lcm_register(0x03, LOW_BYTE(x0)); + set_lcm_register(0x04, HIGH_BYTE(x1)); + set_lcm_register(0x05, LOW_BYTE(x1)); + set_lcm_register(0x06, HIGH_BYTE(y0)); + set_lcm_register(0x07, LOW_BYTE(y0)); + set_lcm_register(0x08, HIGH_BYTE(y1)); + set_lcm_register(0x09, LOW_BYTE(y1)); + + send_ctrl_cmd(0x0022 << 1); + } + +static unsigned int lcm_compare_id(void) +{ + send_ctrl_cmd(0x00); + return (LCM_ID == read_data_cmd())?1:0; +} + + +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER zte6516_lcm_drv = +{ + .name = "zte6516", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .compare_id = lcm_compare_id +}; diff --git a/hauwei_g500_pro_huaqin77_cu_ics2/lcm/inc/lcm_drv.h b/hauwei_g500_pro_huaqin77_cu_ics2/lcm/inc/lcm_drv.h new file mode 100644 index 0000000..2b1eda7 --- /dev/null +++ b/hauwei_g500_pro_huaqin77_cu_ics2/lcm/inc/lcm_drv.h @@ -0,0 +1,537 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), + LCM_DRIVING_CURRENT_6575_4MA = (1 << 4), + LCM_DRIVING_CURRENT_6575_8MA = (3 << 4), + LCM_DRIVING_CURRENT_6575_12MA = (2 << 4), + LCM_DRIVING_CURRENT_6575_16MA = (4 << 4) +} LCM_DRIVING_CURRENT; + + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4, + LCM_DBI_DATA_WIDTH_32BITS = 5 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; + + +/* DSI related enumerations */ + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_DSI_FORMAT_RGB565 = 0, + LCM_DSI_FORMAT_RGB666 = 1, + LCM_DSI_FORMAT_RGB888 = 2 +} LCM_DSI_FORMAT; + + +typedef enum +{ + LCM_DSI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DSI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DSI_TRANS_SEQ; + + +typedef enum +{ + LCM_DSI_PADDING_ON_LSB = 0, + LCM_DSI_PADDING_ON_MSB = 1 +} LCM_DSI_PADDING; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +////////////////////////////////////MT6575 added params, and if lcm driver is for 6575, only care these below params + unsigned int css; + unsigned int csh; + unsigned int rd_1st; + unsigned int rd_2nd; + unsigned int wr_1st; + unsigned int wr_2nd; + + unsigned int sif_3wire; + unsigned int sif_sdi; + LCM_POLARITY sif_1st_pol; + LCM_POLARITY sif_sck_def; + unsigned int sif_div2; + unsigned int sif_hw_cs; +//////////////////////////////////// +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_hold; + unsigned int read_latency; + unsigned int wait_period; + /*only for 6575*/ + unsigned int cs_high_width; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DSI_TRANS_SEQ trans_seq; + LCM_DSI_PADDING padding; + LCM_DSI_FORMAT format; +} LCM_DSI_DATA_FORMAT; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + union { + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; + }; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int dpi_clk_div; // 2..32 + + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + unsigned int i2x_en; + unsigned int i2x_edge; + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + + LCM_LANE_NUM LANE_NUM; + LCM_DSI_DATA_FORMAT data_format; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int packet_size; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int horizontal_sync_active; + unsigned int horizontal_backporch; + unsigned int horizontal_frontporch; + unsigned int horizontal_active_pixel; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + + unsigned int pll_div1; + unsigned int pll_div2; + + unsigned int lcm_int_te_monitor; + unsigned int lcm_int_te_period; + + unsigned int lcm_ext_te_monitor; + + unsigned int noncont_clock; + unsigned int noncont_clock_period; + +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq_V2)(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update); + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + unsigned int (*dsi_dcs_read_lcm_reg)(unsigned char cmd); + unsigned int (*dsi_dcs_read_lcm_reg_v2)(unsigned char cmd, unsigned char *buffer, unsigned char buffer_size); + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned char pull_en); + +} LCM_UTIL_FUNCS; + + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + void (*update)(unsigned int x, unsigned int y, + unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); +///////////////////////////CABC backlight related function + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + void (*set_backlight_mode)(unsigned int mode); +/////////////////////////// + +/////////////ESD_RECOVERY////////////////////// + unsigned int (*esd_check)(void); + unsigned int (*esd_recover)(void); + +///////////////////////////////////////////////// + +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); + +#endif // __LCM_DRV_H__ diff --git a/hauwei_g500_pro_huaqin77_cu_ics2/lcm/mt65xx_lcm_list.c b/hauwei_g500_pro_huaqin77_cu_ics2/lcm/mt65xx_lcm_list.c new file mode 100644 index 0000000..eba5c53 --- /dev/null +++ b/hauwei_g500_pro_huaqin77_cu_ics2/lcm/mt65xx_lcm_list.c @@ -0,0 +1,189 @@ +#include +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER hx8369_6575_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_lcm_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER nt35582_mcu_6575_lcm_drv; +extern LCM_DRIVER nt35582_rgb_6575_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_hvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_qvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369b_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER ha5266_lcm_drv; +extern LCM_DRIVER hsd070idw1_lcm_drv; +extern LCM_DRIVER lg4571_lcm_drv; +extern LCM_DRIVER lvds_wsvga_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_n_lcm_drv; +extern LCM_DRIVER nt35565_3d_lcm_drv; +extern LCM_DRIVER tm070ddh03_lcm_drv; +extern LCM_DRIVER r61408_lcm_drv; +extern LCM_DRIVER nt35510_lcm_drv; +extern LCM_DRIVER nt35510_hvga_lcm_drv; +extern LCM_DRIVER nt35510_qvga_lcm_drv; +extern LCM_DRIVER nt35510_6517_lcm_drv; +extern LCM_DRIVER nt35516_dsi_3P2463_lcm_drv;//tangzp_120516 +extern LCM_DRIVER r63303_idisplay_lcm_drv; + +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(NT35516_DSI_3P2463) + &nt35516_dsi_3P2463_lcm_drv, +#endif +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(HX8369_6575) + &hx8369_6575_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(NT35582_MCU_6575) + &nt35582_mcu_6575_lcm_drv, +#endif + +#if defined(NT35582_RGB_6575) + &nt35582_rgb_6575_lcm_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(R61408) + &r61408_lcm_drv, +#endif + +#if defined(HX8369_DSI_VDO) + &hx8369_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI) + &hx8369_dsi_6575_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_HVGA) + &hx8369_dsi_6575_hvga_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_QVGA) + &hx8369_dsi_6575_qvga_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(NT35510) + &nt35510_lcm_drv, +#endif + +#if defined(NT35510_HVGA) + &nt35510_hvga_lcm_drv, +#endif + +#if defined(NT35510_QVGA) + &nt35510_qvga_lcm_drv, +#endif + +#if defined(NT35510_6517) + &nt35510_6517_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(HA5266) + &ha5266_lcm_drv, +#endif + +#if defined(HSD070IDW1) + &hsd070idw1_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI) + &hx8363_6575_dsi_lcm_drv, +#endif + +#if defined(LG4571) + &lg4571_lcm_drv, +#endif + +#if defined(LVDS_WSVGA) + &lvds_wsvga_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI) + &lvds_wsvga_ti_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI_N) + &lvds_wsvga_ti_n_lcm_drv, +#endif + +#if defined(NT35565_3D) + &nt35565_3d_lcm_drv, +#endif + +#if defined(TM070DDH03) + &tm070ddh03_lcm_drv, +#endif +#if defined(R63303_IDISPLAY) + &r63303_idisplay_lcm_drv, +#endif + +#if defined(HX8369B_DSI_VDO) + &hx8369b_dsi_vdo_lcm_drv, +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*)); diff --git a/hauwei_g500_pro_huaqin77_cu_ics2/lcm/nt35516_dsi_3P2463/nt35516_dsi_3P2463.c b/hauwei_g500_pro_huaqin77_cu_ics2/lcm/nt35516_dsi_3P2463/nt35516_dsi_3P2463.c new file mode 100644 index 0000000..dcd6dd9 --- /dev/null +++ b/hauwei_g500_pro_huaqin77_cu_ics2/lcm/nt35516_dsi_3P2463/nt35516_dsi_3P2463.c @@ -0,0 +1,1436 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + */ +/* MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2008 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include + +#include "lcm_drv.h" +#ifndef BUILD_UBOOT +#include +#include ///for printk +#include +#include "cust_leds.h" +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (540) +#define FRAME_HEIGHT (960) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +/* lcm_id, mika add */ +#define LCM_ID (0x00) + +#ifdef BUILD_UBOOT +#undef printk +#define printk printf +#endif + + +static unsigned int lcm_esd_test = TRUE; ///only for ESD test +#ifndef BUILD_UBOOT +#ifdef HQ_LCD_ESD_CHECK + bool havesuspended = FALSE; +extern int mt65xx_led_set_cust_public(struct cust_mt65xx_led *cust, int level); +extern unsigned int bl_brightness; +#endif +#endif +static unsigned int lcm_read_reg_value(); +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +//#define MDELAY(n) (lcm_util.mdelay(n)) +#define MDELAY(n) mdelay(n) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq_HQ(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_HQ(cmd, count, ppara, force_update) //kaka_12_0121 +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) +#define read_reg_v3(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) //kaka_12_0131 //tangzp_120516 ?? + +static struct LCM_setting_table { + unsigned cmd; + unsigned char count; + unsigned char para_list[64]; +}; + + +/* proc file system */ +#ifndef BUILD_UBOOT +#define NT35516_CONFIG_PROC_FILE "nt35516_config" +static struct proc_dir_entry *nt35516_config_proc = NULL; +#endif + + + + + + +#define LCM_INIT_DEBUG +#define LCM_USE_VIRTUAL_INVERTION +static struct LCM_setting_table lcm_initialization_setting[] = { + + /* + Note : + + Data ID will depends on the following rule. + + count of parameters > 1 => Data ID = 0x39 + count of parameters = 1 => Data ID = 0x15 + count of parameters = 0 => Data ID = 0x05 + + Structure Format : + + {DCS command, count of parameters, {parameter list}} + {REGFLAG_DELAY, milliseconds of time, {}}, + + ... + + Setting ending by predefined flag + + {REGFLAG_END_OF_TABLE, 0x00, {}} + */ + +#ifdef LCM_INIT_DEBUG + + /* level 3 */ + #if 0 + {0xFF, 4, {0xAA,0x55,0x25,0x01}}, + {REGFLAG_DELAY, 2, {}}, + + {0xF2, 35, {0x00,0x00,0x4A,0x0A,0xA8, + 0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0B,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x40,0x01, + 0x51,0x00,0x01,0x00,0x01}}, + {REGFLAG_DELAY, 10, {}}, + + {0xF3, 7, {0x02,0x03,0x07,0x45,0x88,0xD1,0x0D}}, + {REGFLAG_DELAY, 2, {}}, + #endif + /***************************************/ + /* CMD2, Page 0 */ + /***************************************/ + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x00}}, + {REGFLAG_DELAY, 2, {}}, + + {0xB1, 3, {0xCC,0x00,0x00}}, /* dispplay option contorl, mode: 4c, mode: cc */ + {REGFLAG_DELAY, 2, {}}, + + {0xB8, 4, {0x01,0x02,0x02,0x02}}, /*EQ control function for source driver */ + {REGFLAG_DELAY, 2, {}}, + + #ifdef LCM_USE_VIRTUAL_INVERTION + #else + + {0xB7, 2, {0x33,0x33}}, /* invertion control */ + {REGFLAG_DELAY, 2, {}}, + + {0xBC, 3, {0x04,0x04,0x04}}, /* invertion control */ + {REGFLAG_DELAY, 2, {}}, + #endif + + {0xC9, 6, {0x63,0x06,0x0D,0x1A,0x17,0x00}}, + {REGFLAG_DELAY, 2, {}}, + + /***************************************/ + /* CMD2, Page 1 */ + /***************************************/ + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x01}}, + {REGFLAG_DELAY, 2, {}}, + + {0xB0, 3, {0x05,0x05,0x05}}, /* Page.1, set AVDD voltage*/ + {REGFLAG_DELAY, 2, {}}, + + {0xB1, 3, {0x05,0x05,0x05}}, /* page.1, set AVEE voltage */ + {REGFLAG_DELAY, 2, {}}, + + {0xB2, 3, {0x01,0x01,0x01}}, /* page,1, set VCL voltage */ + {REGFLAG_DELAY, 2, {}}, + + {0xB3, 3, {0x0E,0x0E,0x0E}}, /* Page.1, set VGH voltage */ + {REGFLAG_DELAY, 2, {}}, + + #ifdef LCM_USE_VIRTUAL_INVERTION + {0xB4, 3, {0x0A,0x0A,0x0A}}, /* Page.1, set VGLX voltage */ + #else + {0xB4, 3, {0x08,0x08,0x08}}, + #endif + {REGFLAG_DELAY, 2, {}}, + + {0xB6, 3, {0x44,0x44,0x44}}, /* Page.1, set AVDD boosting times/frequency */ + {REGFLAG_DELAY, 2, {}}, + + {0xB7, 3, {0x34,0x34,0x34}}, /* Page.1, set AVEE boosting times/frequency */ + {REGFLAG_DELAY, 2, {}}, + + #ifdef LCM_USE_VIRTUAL_INVERTION + {0xB8, 3, {0x20,0x20,0x20}}, /* Page.1, set VCL boosting times/frequency */ + #else + {0xB8, 3, {0x10,0x10,0x10}}, + #endif + {REGFLAG_DELAY, 2, {}}, + + //{0xB9, 3, {0x26,0x26,0x26}}, /* Page.1, set VGH boosting times/frequency */ + {0xB9, 3, {0x36,0x36,0x36}}, /* Page.1, set VGH boosting times/frequency */ + {REGFLAG_DELAY, 2, {}}, + + {0xBA, 3, {0x24,0x24,0x24}}, /* Page.1, set VGLX boosting times/frequency */ + {REGFLAG_DELAY, 2, {}}, + + {0xBC, 3, {0x00,0xC8,0x00}}, /* Page.1, set VGMP/VGSP voltages */ + {REGFLAG_DELAY, 2, {}}, + + {0xBD, 3, {0x00,0xC8,0x00}}, /* Page.1, set VGMN/VGSN voltages */ + {REGFLAG_DELAY, 2, {}}, + + {0xBE, 1, {0x78}}, // 76 /* Page.1, set DC VCOM offset */ + {REGFLAG_DELAY, 2, {}}, + + {0xC0, 2, {0x04,0x00}}, /* gpio config */ + {REGFLAG_DELAY, 2, {}}, + + {0xCA, 1, {0x00}}, /* Page.1, gate signal voltage control*/ + {REGFLAG_DELAY, 2, {}}, + + {0xD0, 4, {0x0A,0x10,0x0D,0x0F}}, /* Page.1, set gradient for gamma divider */ + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Red” (node 1~node 8) */ + {0xD1, 16, {0x00,0x70,0x00,0xCE,0x00,0xF7,0x01,0x10,0x01,0x21,0x01,0x44,0x01,0x62,0x01,0x8D}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Red” (node 9~node 16) */ + {0xD2, 16, {0x01,0xAF,0x01,0xE4,0x02,0x0C,0x02,0x4D,0x02,0x82,0x02,0x84,0x02,0xB8,0x02,0xF0}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Red” (node 17~node 24) */ + {0xD3, 16, {0x03,0x14,0x03,0x42,0x03,0x5E,0x03,0x80,0x03,0x97,0x03,0xB0,0x03,0xC0,0x03,0xDF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Red” (node 25~node 26) */ + {0xD4, 4, {0x03,0xFD,0x03,0xFF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Green” (node 1~node 8) */ + {0xD5, 16, {0x00,0x70,0x00,0xCE,0x00,0xF7,0x01,0x10,0x01,0x21,0x01,0x44,0x01,0x62,0x01,0x8D}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Green” (node 9~node 16) */ + {0xD6, 16, {0x01,0xAF,0x01,0xE4,0x02,0x0C,0x02,0x4D,0x02,0x82,0x02,0x84,0x02,0xB8,0x02,0xF0}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Green” (node 17~node 24) */ + {0xD7, 16, {0x03,0x14,0x03,0x42,0x03,0x5E,0x03,0x80,0x03,0x97,0x03,0xB0,0x03,0xC0,0x03,0xDF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Green” (node 25~node 26) */ + {0xD8, 4, {0x03,0xFD,0x03,0xFF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Blue” (node 1~node 8) */ + {0xD9, 16, {0x00,0x70,0x00,0xCE,0x00,0xF7,0x01,0x10,0x01,0x21,0x01,0x44,0x01,0x62,0x01,0x8D}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Blue” (node 9~node 16) */ + {0xDD, 16, {0x01,0xAF,0x01,0xE4,0x02,0x0C,0x02,0x4D,0x02,0x82,0x02,0x84,0x02,0xB8,0x02,0xF0}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Blue” (node 17~node 24) */ + {0xDE, 16, {0x03,0x14,0x03,0x42,0x03,0x5E,0x03,0x80,0x03,0x97,0x03,0xB0,0x03,0xC0,0x03,0xDF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for positive ”Blue” (node 25~node 26) */ + {0xDF, 4, {0x03,0xFD,0x03,0xFF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Red” (node 1~node 8) */ + {0xE0, 16, {0x00,0x70,0x00,0xCE,0x00,0xF7,0x01,0x10,0x01,0x21,0x01,0x44,0x01,0x62,0x01,0x8D}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Red” (node 9~node 16) */ + {0xE1, 16, {0x01,0xAF,0x01,0xE4,0x02,0x0C,0x02,0x4D,0x02,0x82,0x02,0x84,0x02,0xB8,0x02,0xF0}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Red” (node 17~node 24) */ + {0xE2, 16, {0x03,0x14,0x03,0x42,0x03,0x5E,0x03,0x80,0x03,0x97,0x03,0xB0,0x03,0xC0,0x03,0xDF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Red” (node 25~node 26) */ + {0xE3, 4, {0x03,0xFD,0x03,0xFF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Green” (node 1~node 8) */ + {0xE4, 16, {0x00,0x70,0x00,0xCE,0x00,0xF7,0x01,0x10,0x01,0x21,0x01,0x44,0x01,0x62,0x01,0x8D}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Green” (node 9~node 16) */ + {0xE5, 16, {0x01,0xAF,0x01,0xE4,0x02,0x0C,0x02,0x4D,0x02,0x82,0x02,0x84,0x02,0xB8,0x02,0xF0}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Green” (node 17~node 24) */ + {0xE6, 16, {0x03,0x14,0x03,0x42,0x03,0x5E,0x03,0x80,0x03,0x97,0x03,0xB0,0x03,0xC0,0x03,0xDF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Green” (node 25~node 26) */ + //{0xE7, 4, {0x03,0xFF,0x03,0xFF}}, + {0xE7, 4, {0x03,0xFD,0x03,0xFF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Blue” (node 1~node 8) */ + {0xE8, 16, {0x00,0x70,0x00,0xCE,0x00,0xF7,0x01,0x10,0x01,0x21,0x01,0x44,0x01,0x62,0x01,0x8D}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Blue” (node 9~node 16) */ + {0xE9, 16, {0x01,0xAF,0x01,0xE4,0x02,0x0C,0x02,0x4D,0x02,0x82,0x02,0x84,0x02,0xB8,0x02,0xF0}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Blue” (node 17~node 24) */ + {0xEA, 16, {0x03,0x14,0x03,0x42,0x03,0x5E,0x03,0x80,0x03,0x97,0x03,0xB0,0x03,0xC0,0x03,0xDF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Page.1, set gamma 2.2 correction characteristic for negative ”Blue” (node 25~node 26) */ + {0xEB, 4, {0x03,0xFD,0x03,0xFF}}, + {REGFLAG_DELAY, 2, {}}, + + /* Tearing effect mode set & on */ + {0x35, 1, {0x00}}, + {REGFLAG_DELAY, 2, {}}, + + /* memory data access control */ + //{0x36, 1, {0x00}}, + {0x36, 1, {0xd4}}, + {REGFLAG_DELAY, 2, {}}, + + /* sleep out / boost on */ + {0x11, 1, {0x00}}, + {REGFLAG_DELAY, 250, {}}, + + + /* display on */ + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 5, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} + + + #else + #endif +}; + +static struct LCM_setting_table lcm_set_window[] = { + {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH>>8), (FRAME_WIDTH&0xFF)}}, + {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT>>8), (FRAME_HEIGHT&0xFF)}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_sleep_out_setting[] = { + + /* Sleep Out */ + {0x11, 1, {0x00}}, + {REGFLAG_DELAY,250, {}},//450 //sleep out time long + + /* Display ON */ + {0x29, 1, {0x00}}, + {REGFLAG_DELAY, 100, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_sleep_in_setting[] = { + /* Display off sequence */ + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 100, {}}, + + /* Sleep Mode On */ + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 140, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_deep_sleep_mode_in_setting[] = { + // Display off sequence + {0x28, 1, {0x00}}, + {REGFLAG_DELAY, 350, {}}, + + // Sleep Mode On + {0x10, 1, {0x00}}, + {REGFLAG_DELAY, 100, {}}, + + /* enter deep standby mode */ + {0x4F, 1, {0x01}}, + {REGFLAG_DELAY, 150, {}}, + + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + + +static struct LCM_setting_table lcm_backlight_level_setting[] = { + {0x51, 1, {0xFF}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_page_1_setting[] = { + {0xF0, 5, {0x55,0xAA,0x52,0x08,0x01}}, + {REGFLAG_DELAY, 2, {}}, +}; + +static struct LCM_setting_table lcm_read_f2_setting[] = { + /* level 3 */ + {0xFF, 4, {0xAA,0x55,0x25,0x01}}, + {REGFLAG_DELAY, 2, {}}, +}; + + +static void lcm_init_setting() +{ + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= 0x2555AAFF; + data_array[2]= 0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + data_array[0]= 0x00243902; + data_array[1]= 0x4A0000F2; + data_array[2]= 0x0000A80A; + data_array[3]= 0x00000000; + data_array[4]= 0x00000000; + data_array[5]= 0x000B0000; + data_array[6]= 0x00000000; + data_array[7]= 0x00000000; + data_array[8]= 0x51014000; + data_array[9]= 0x01000100; + dsi_set_cmdq(&data_array, 10, 1); + mdelay(2); + + data_array[0]= 0x00083902; + data_array[1]= 0x070302F3; + data_array[2]= 0x0DD18845; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* cmd2, page0 */ + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000008; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* dispplay option contorl */ + data_array[0]=0x00043902; + data_array[1]=0x0000CCB1; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00053902; + data_array[1]=0x020201B8; + data_array[2]=0x00000002; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + #ifdef LCM_USE_VIRTUAL_INVERTION + #else + data_array[0]=0x00033902; +// data_array[1]=0x007171B7; + data_array[1]=0x003333B7; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x040404BC; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + #endif + + data_array[0]=0x00073902; + data_array[1]=0x0D0663C9; + data_array[2]=0x0000171A; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* cmd2, page1 */ + data_array[0]=0x00063902; + data_array[1]=0x52AA55F0; + data_array[2]=0x00000108; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x050505B0; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x050505B1; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x010101B2; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x0E0E0EB3; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + #ifdef LCM_USE_VIRTUAL_INVERTION + data_array[0]=0x00043902; + data_array[1]=0x0A0A0AB4; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + #else + data_array[0]=0x00043902; + data_array[1]=0x080808B4; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + #endif + + data_array[0]=0x00043902; + data_array[1]=0x444444B6; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x343434B7; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + #ifdef LCM_USE_VIRTUAL_INVERTION + data_array[0]=0x00043902; + data_array[1]=0x202020B8; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + #else + data_array[0]=0x00043902; + data_array[1]=0x101010B8; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + #endif + + data_array[0]=0x00043902; + data_array[1]=0x262626B9; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x242424BA; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x00C800BC; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00043902; + data_array[1]=0x00C800BD; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00023902; + data_array[1]=0x00007CBE; //7e + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00033902; + data_array[1]=0x000004C0; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00023902; + data_array[1]=0x000000CA; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00053902; + data_array[1]=0x0D100AD0; + data_array[2]=0x0000000F; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* D1~D4 */ + data_array[0]=0x00113902; + data_array[1]=0x007000D1; + data_array[2]=0x01FD00B2; + data_array[3]=0x0138011F; + data_array[4]=0x01720157; + data_array[5]=0x0000009C; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x01BA01D2; + data_array[2]=0x021502ED; + data_array[3]=0x02870254; + data_array[4]=0x02BA0289; + data_array[5]=0x000000EE; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x031303D3; + data_array[2]=0x035C033F; + data_array[3]=0x0394037C; + data_array[4]=0x03C703AD; + data_array[5]=0x000000EA; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00053902; + data_array[1]=0x03FD03D4; + data_array[2]=0x000000FF; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* D5~D8 */ + data_array[0]=0x00113902; + data_array[1]=0x007000D5; + data_array[2]=0x01FD00B2; + data_array[3]=0x0138011F; + data_array[4]=0x01720157; + data_array[5]=0x0000009C; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x01BA01D6; + data_array[2]=0x021502ED; + data_array[3]=0x02870254; + data_array[4]=0x02BA0289; + data_array[5]=0x000000EE; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x031303D7; + data_array[2]=0x035C033F; + data_array[3]=0x0394037C; + data_array[4]=0x03C703AD; + data_array[5]=0x000000EA; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00053902; + data_array[1]=0x03FD03D8; + data_array[2]=0x000000FF; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* D9 DD DE DF */ + data_array[0]=0x00113902; + data_array[1]=0x007000D9; + data_array[2]=0x01FD00B2; + data_array[3]=0x0138011F; + data_array[4]=0x01720157; + data_array[5]=0x0000009C; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x01BA01DD; + data_array[2]=0x021502ED; + data_array[3]=0x02870254; + data_array[4]=0x02BA0289; + data_array[5]=0x000000EE; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x031303DE; + data_array[2]=0x035C033F; + data_array[3]=0x0394037C; + data_array[4]=0x03C703AD; + data_array[5]=0x000000EA; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00053902; + data_array[1]=0x03FD03DF; + data_array[2]=0x000000FF; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* E0~E3 */ + data_array[0]=0x00113902; + data_array[1]=0x007000E0; + data_array[2]=0x01FD00B2; + data_array[3]=0x0138011F; + data_array[4]=0x01720157; + data_array[5]=0x0000009C; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x01BA01E1; + data_array[2]=0x021502ED; + data_array[3]=0x02870254; + data_array[4]=0x02BA0289; + data_array[5]=0x000000EE; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x031303E2; + data_array[2]=0x035C033F; + data_array[3]=0x0394037C; + data_array[4]=0x03C703AD; + data_array[5]=0x000000EA; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00053902; + data_array[1]=0x03FD03E3; + data_array[2]=0x000000FF; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* E4~E7 */ + data_array[0]=0x00113902; + data_array[1]=0x007000E4; + data_array[2]=0x01FD00B2; + data_array[3]=0x0138011F; + data_array[4]=0x01720157; + data_array[5]=0x0000009C; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x01BA01E5; + data_array[2]=0x021502ED; + data_array[3]=0x02870254; + data_array[4]=0x02BA0289; + data_array[5]=0x000000EE; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x031303E6; + data_array[2]=0x035C033F; + data_array[3]=0x0394037C; + data_array[4]=0x03C703AD; + data_array[5]=0x000000EA; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00053902; + data_array[1]=0x03FD03E7; + data_array[2]=0x000000FF; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + + /* E8~EB */ + data_array[0]=0x00113902; + data_array[1]=0x007000E8; + data_array[2]=0x01FD00B2; + data_array[3]=0x0138011F; + data_array[4]=0x01720157; + data_array[5]=0x0000009C; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x01BA01E9; + data_array[2]=0x021502ED; + data_array[3]=0x02870254; + data_array[4]=0x02BA0289; + data_array[5]=0x000000EE; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00113902; + data_array[1]=0x031303EA; + data_array[2]=0x035C033F; + data_array[3]=0x0394037C; + data_array[4]=0x03C703AD; + data_array[5]=0x000000EA; + dsi_set_cmdq(&data_array, 6, 1); + mdelay(2); + + data_array[0]=0x00053902; + data_array[1]=0x03FD03EB; + data_array[2]=0x000000FF; + dsi_set_cmdq(&data_array, 3, 1); + mdelay(2); + + /* */ + data_array[0]=0x00023902; + data_array[1]=0x00000035; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00023902; + data_array[1]=0x0000D436; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00023902; + data_array[1]=0x00000011; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(200); + + #if 0 + data_array[0]=0x00023902; + data_array[1]=0x0000773A; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(2); + + data_array[0]=0x00023902; + data_array[1]=0x00000013; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(40); + #endif + + data_array[0]=0x00023902; + data_array[1]=0x00000029; + dsi_set_cmdq(&data_array, 2, 1); + mdelay(40); + +} +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + +/* + * proc file syestem + */ +static int nt35516_config_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + return 0; +} + + +static int nt35516_config_write_proc(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + + /* reset lcm */ + SET_RESET_PIN(1); + SET_RESET_PIN(0); + MDELAY(1); + SET_RESET_PIN(1); + MDELAY(10); + printk("lcm reset...\n"); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + printk("lcm load initialization setting...\n"); + + return 0; +} +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; /* width */ + params->height = FRAME_HEIGHT; /* height */ + + // enable tearing-free + params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY; + params->dbi.te_edge_polarity = LCM_POLARITY_RISING; + + params->dsi.mode = CMD_MODE; + + // DSI + /* Command mode setting */ + params->dsi.LANE_NUM = LCM_TWO_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + + params->dsi.word_count=540*3; + params->dsi.vertical_sync_active=2; + #if 0 + /* nomal parameters */ + params->dsi.vertical_backporch=2; + params->dsi.vertical_frontporch=2; + #else + /* debug parameters */ + params->dsi.vertical_backporch=6; + params->dsi.vertical_frontporch=6; + #endif + params->dsi.vertical_active_line=960; + + //params->dsi.line_byte=2256; // 2256 = 752*3 need to check? + params->dsi.line_byte=2180; // 2256 = 752*3 need to check? + params->dsi.horizontal_sync_active_byte=26; + params->dsi.horizontal_backporch_byte=206; + params->dsi.horizontal_frontporch_byte=206; + params->dsi.rgb_byte=(540*3+6); + + params->dsi.horizontal_sync_active_word_count=20; + params->dsi.horizontal_backporch_word_count=200; + params->dsi.horizontal_frontporch_word_count=200; + + // Bit rate calculation + params->dsi.pll_div1=40; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz) + params->dsi.pll_div2=1; // div2=0~15: fout=fvo/(2*div2) + +} + + +static void lcm_init(void) +{ + unsigned int data_array[16]; + + + + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(30); + SET_RESET_PIN(1); + MDELAY(130); +#ifdef BUILD_UBOOT + printf("lcm init:\n"); +#endif +#if 0 + data_array[0]= 0x00053902; + data_array[1]= 0x2555AAFF; + data_array[2]= 0x00000001; + dsi_set_cmdq(&data_array, 3, 1); + + data_array[0]= 0x00243902; + data_array[1]= 0x4A0000F2; + data_array[2]= 0x0000A80A; + data_array[3]= 0x00000000; + data_array[4]= 0x00000000; + data_array[5]= 0x000B0000; + data_array[6]= 0x00000000; + data_array[7]= 0x00000000; + data_array[8]= 0x51014000; + data_array[9]= 0x01000100; + dsi_set_cmdq(&data_array, 10, 1); + + data_array[0]= 0x00083902; + data_array[1]= 0x070302F3; + data_array[2]= 0x0DD18845; + dsi_set_cmdq(&data_array, 3, 1); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); +#else + lcm_init_setting(); +#endif + /* create proc file system */ + #ifndef BUILD_UBOOT + nt35516_config_proc = create_proc_entry( NT35516_CONFIG_PROC_FILE, 0666, NULL); + + if ( nt35516_config_proc == NULL ){ + printk("create_proc_entry %s failed\n", NT35516_CONFIG_PROC_FILE ); + } else { + nt35516_config_proc->read_proc = nt35516_config_read_proc; + nt35516_config_proc->write_proc = nt35516_config_write_proc; + } + #endif + +} + +static unsigned int lcm_check_register() +{ + #ifndef BUILD_UBOOT + unsigned char buffer[7]; + unsigned int array[16]; //mipi command + int i; + + + /* read id test */ + push_table(lcm_read_f2_setting, sizeof(lcm_read_f2_setting) / sizeof(struct LCM_setting_table), 1); + array[0] = 0x00073700; + dsi_set_cmdq(array, 1, 1); + read_reg_v3(0xF3, buffer, 7); + + printk("%s, nt35516 F0 register:" + "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", + __func__, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6]); + if( (buffer[0]!=0x02) || (buffer[1]!=0x03) || (buffer[2]!=0x07) ) + { + return FALSE; + } + else + { + return TRUE; + } + #endif + +} + + +//#define USE_DEEP_SLEEP_MODE +static void lcm_suspend(void) +{ + #if defined(USE_DEEP_SLEEP_MODE) + push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1); + #else + push_table(lcm_sleep_in_setting, sizeof(lcm_sleep_in_setting) / sizeof(struct LCM_setting_table), 1); + #endif + #ifndef BUILD_UBOOT + #ifdef HQ_LCD_ESD_CHECK + havesuspended = TRUE; + #endif + #endif +} + + +static void lcm_resume(void) +{ + + /* resume from deep sleep standby mode , registers and sdram data will loss in deep sleep standby mode + + set reset pin low pluse more than 3ms + and delay 4 frames or more after reset */ + #if defined(USE_DEEP_SLEEP_MODE) + SET_RESET_PIN(1); + MDELAY(1); + SET_RESET_PIN(0); + MDELAY(5); + SET_RESET_PIN(1); + MDELAY(10); + + /* initial instuction setting and SRAM data setting */ + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + + #else + /* display on */ + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + + #ifndef BUILD_UBOOT + #ifdef HQ_LCD_ESD_CHECK + printk("lcm_resume start \n"); + if(TRUE == lcm_read_reg_value()) + { + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(30); + SET_RESET_PIN(1); + MDELAY(130); + lcm_init_setting(); + } + else + { + havesuspended = FALSE; + printk("lcm register is ok \n"); + } + #endif + #endif + #endif +} + + +static void lcm_update(unsigned int x, unsigned int y, + unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + data_array[3]= 0x00053902; + data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[5]= (y1_LSB); + data_array[6]= 0x002c3909; + + dsi_set_cmdq(&data_array, 7, 0); + #ifndef BUILD_UBOOT + #ifdef HQ_LCD_ESD_CHECK + if(havesuspended) + { + MDELAY(200); + havesuspended = FALSE; + struct cust_mt65xx_led *cust_led_list = get_cust_led_list(); + mt65xx_led_set_cust_public(&cust_led_list[6],bl_brightness); + } + #endif + #endif +} + + +static void lcm_setbacklight(unsigned int level) +{ + // Refresh value of backlight level. + lcm_backlight_level_setting[0].para_list[0] = level; + + push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1); +} + + +static void lcm_setpwm(unsigned int divider) +{ + // TBD +} + + +static unsigned int lcm_getpwm(unsigned int divider) +{ + // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk; + // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706 + unsigned int pwm_clk = 23706 / (1<= 2){ + printk("lcm_esd test register[0x0A] value = 0x%x, 0x%x, 0x%x,0x%x, 0x%x,0x%x\n", + buffer_1[0], buffer_1[1], buffer_1[2], buffer_1[3],buffer_1[4], buffer_1[5]); + err_count = 0; + return TRUE;// lcm recovery + } else { + return FALSE;// do nothing + } + #endif +} + +static unsigned int lcm_esd_check() +{ +#ifndef BUILD_UBOOT + printk("lcm_esd enter"); + + //kaka_12_0607_add + //return 0; //This just debug, Must removed when esd check fucnion is OK. + //kaka_12_0607_end + + if(lcm_esd_test) + { + + printk("lcm_esd test return true \n"); + /* mika */ + #if 0 + lcm_esd_test = FALSE; + return TRUE; // lcm recovery + #else + return lcm_read_reg_value(); + #endif + } + + return FALSE; // do nothind + +#endif +} +static unsigned int lcm_dsi_read_test(unsigned char cmd) +{ +#ifndef BUILD_UBOOT + /// please notice: the max return packet size is 1 + /// if you want to change it, you can refer to the following marked code + /// but read_reg currently only support read no more than 4 bytes.... + /// if you need to read more, please let BinHan knows. +/* + unsigned int data_array[16]; + unsigned int max_return_size = 1; + + data_array[0]= 0x00003700 | (max_return_size << 16); + + dsi_set_cmdq(&data_array, 1, 1); +*/ + return read_reg(cmd); +#endif +} + +static unsigned int lcm_esd_recover() +{ + unsigned char para = 0; + +#ifndef BUILD_UBOOT + printk("lcm_esd_recover enter"); +#endif + + + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(30); + SET_RESET_PIN(1); + MDELAY(130); + #if 0 + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1); + MDELAY(10); + #else + lcm_init_setting(); + #endif + + dsi_set_cmdq_V2(0x35, 1, ¶, 1); ///enable TE + MDELAY(10); + + return TRUE; +} + +//#define READ_ADC_ID +extern int IMM_GetOneChannelValue(int dwChannel, int deCount); +static unsigned int lcm_compare_id() +{ + + #ifdef READ_ADC_ID + int lcm_id0 = 0; + int lcm_id1 = 0; + lcm_id0 = IMM_GetOneChannelValue(1,20); + lcm_id1 = IMM_GetOneChannelValue(2,20); + + printk("nt35516_dsi_3P2463 lcd_id0:%d lcm_id1:%d\n", + lcm_id0, lcm_id1); + + if( (lcm_id0>1600) && (lcm_id0<2000) && + (lcm_id1>1600) && (lcm_id1<2000)) { + + return TRUE; + + } else { + return FALSE; + } + #else + unsigned int id = 0; + unsigned char buffer[3]; + unsigned int array[16]; + + /* reset lcm first */ + SET_RESET_PIN(1); + MDELAY(10); + SET_RESET_PIN(0); + MDELAY(30); + SET_RESET_PIN(1); + MDELAY(30); + + /* read id + * read_id return 3bytes data, + * 1st module's manufacture id + * 2nd module/driver version id + * 3rd module/driver id + */ + + array[0] = 0x00033700;// read id return two byte,version and id + dsi_set_cmdq(array, 1, 1); + + read_reg_v2(0x04, buffer, 3); + id = buffer[0]; + printk("%s, nt35516_dsi_3P2463 id1=0x%02x id2=0x%02x, id3=0x%02x\n", + __func__, buffer[0], buffer[1], buffer[2]); + + return (LCM_ID == id) ? TRUE : FALSE ; + #endif +} +// --------------------------------------------------------------------------- +// Get LCM Driver Hooks +// --------------------------------------------------------------------------- +LCM_DRIVER nt35516_dsi_3P2463_lcm_drv = +{ + .name = "nt35516_dsi_3P2463", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .update = lcm_update, + .set_backlight = lcm_setbacklight, + .set_pwm = lcm_setpwm, + .get_pwm = lcm_getpwm, + .esd_check = lcm_esd_check, + .esd_recover = lcm_esd_recover, + .compare_id = lcm_compare_id, +};