您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 针对MTK平台下,LCD调试步骤以及常见的一些问题
一、LCD调试步骤(针对MTK平台):1、核对LCD模组的PIN脚定义与手机LCD接口PIN定义是否一致当我们拿到一个项目的新屏调试时,首先要拿到LCD模组的规格书和LCDIC的规格书,再去核对规格书上LCD模组的PIN脚定义与我们手机原理图上的LCDPIN脚定义是否相符,若不符就不用再往下做了。(在这里我顺便提一下:器件、IC以及一些模块的规格书和电路原理图等资料对驱动工程师来说是很重要的,如果这些资料都不全或者没有,那么驱动工程师要去完成一个驱动程序的编写是很困难的,甚至几乎是无从下手的。)LCD模组的规格书我们可以从中得到LCD的像素点阵(即分辩率)大小、驱动IC型号、LCD的PIN脚定义等这些对我们有用的信息,如下图1、图2所示图1图2针对MTK平台来说,核对规格书LCD的分辨率为了点屏时在**_GPRS.MAK文件中MAIN_LCD_SIZE=176X220这个宏来配置相对应的分辨率;2、写LCD的背光驱动程序,点亮LCD的背光灯。在LCD模组的构成中,LCD的背光灯是LCD的一个重要组成部分,如果LCD的背光灯不点亮那么就算把LCD的驱动写好了也是无法正常看到LCD显示的。LCD背光灯的驱动程序是根据硬件所用LCD背光灯驱动IC的工作方式来写的,不同的背光驱动IC有不同的工作方式,写好驱动程序驱动背光驱动IC工作从而把LCD的背光灯点亮。在MTK平台中,LCD背灯驱动函数在uem_gpio.c文件custom_cfg_gpio_set_level();中写。LCD背光灯的驱动程序的编写要看背光驱动IC的资料了解背光驱动IC的工作方式,一般背光驱动IC的工作方式有PWM控制方式、脉冲控制方式、编码控制方式等。3、写LCD的初始化程序。MTK平台LCD驱动程序调试修改最多的就是在lcd.c和lcd_sw.h这两个文件,所涉及的要关程序如下:LCD_FuncsLCD_func_S6D04H0={LCD_Init_S6D04H0,LCD_PWRON_S6D04H0,LCD_SetContrast_S6D04H0,LCD_ON_S6D04H0,LCD_BlockWrite_S6D04H0,LCD_Size_S6D04H0,LCD_EnterSleep_S6D04H0,LCD_ExitSleep_S6D04H0,LCD_Partial_On_S6D04H0,LCD_Partial_Off_S6D04H0,LCD_Partial_line_S6D04H0,/*Engineeringmode*/LCD_GetParm_S6D04H0,LCD_SetBias_S6D04H0,LCD_Contrast_S6D04H0,LCD_LineRate_S6D04H0,LCD_Temp_Compensate_S6D04H0#ifdefLCM_ROTATE_SUPPORT,LCD_Set_Scan_Direction_S6D04H0#endif#ifdefLQT_SUPPORT/*DonotremoveLQTcodesegment*/,LCD_gamma_test,LCD_flicker_test#endif,0//NULLfunctionforSetFrmMarkerFunction.,LCD_IOCTRL_S6D04H0};voidLCD_FunConfig(void){MainLCD=&LCD_func_S6D04H0;#ifdefDUAL_LCDSubLCD=#endif}LCD的初始化程序就是在LCD_Init_S6D04H0();这个函数里面写,如下所示:voidLCD_Init_S6D04H0(kal_uint32bkground,void**buf_addr){SET_LCD_CTRL_RESET_PIN;LCD_Delay(0x4000);CLEAR_LCD_CTRL_RESET_PIN;LCD_Delay(0x4000);SET_LCD_CTRL_RESET_PIN;LCD_Delay(0x40000);//以上这一部分是RESETLCD,必需的………//中间这一部分是LCD的初始化代码,一般LCD厂会提供。{kal_uint16i,j;for(i=0;iLCD_WIDTH;i++){for(j=0;jLCD_HEIGHT;j++){LCD_DataWrite_CMD(0x0000);}}}//这部分是给屏刷一满屏单色}为了验证LCD的初始化程序是否正确我们可以通过把LCD_BlockWrite_S6D04H0();LCD_EnterSleep_S6D04H0();LCD_ExitSleep_S6D04H0();这几个函数RETURN掉,再通过刷一屏单色来看,通过修改上面红色部分的参数就可刷出不同颜色出来,0X0000刷出来的是黑色,0X00FF是蓝色。一般来说如果刷出整屏单色那初始化就是正确的,否则初始化代码就不对的。另外,写LCD驱动程序时还要先确定LCD的接口数据线是多少位的,LCD驱动IC的寄存器又是多少位的,从而选择正确的命令、数据语句来写代码。定义这些语句是的在lcd_sw.h文件中,分别有8位、9位、16位、18位等这几种,另外还分有DMA和非DMA两种方式(DMA方式简单,速度快,通过MTK的寄存器进行操作,但灵活性差。非DMA方式,直接对地址操作,灵活性好,但速度会有影响。目前,一般都是用DMA方式)。数据线的位数一般常用的是8位和16位,一般对于16位接口的数据线,不管驱动IC的寄存器是8位的还是16位的,数据只需进行一次传送就可以了;而对于8位接口的数据线,若驱动IC的寄存器是8位的则数据进行一次传送就可以了,若驱动IC的寄存器是16位的则数据就需要进行两次传送,先传高8位再传低8位。如下在lcd_sw.h文件中的一些定义:#ifdefLCD_CMD_DMA_MODE//DMA方式#defineLCD_SEND_DMA_CMD(n)\{\volatilekal_int32i;\while(LCD_IS_RUNNING){};\DISABLE_LCD_TRANSFER_COMPLETE_INT;\DISABLE_ALL_LCD_LAYER_WINDOW;\SET_LCD_ROI_CTRL_NUMBER_OF_CMD(n);\ENABLE_LCD_ROI_CTRL_CMD_FIRST;\SET_LCD_ROI_WINDOW_SIZE(0,0);\START_LCD_TRANSFER;\for(i=0;i50;i++){};\while(LCD_IS_RUNNING){};\}#if(defined(MAIN_LCD_8BIT_MODE))//定义8位#defineLCD_CtrlWrite_S6D04H0(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_CMD,(_data&0xFF));\LCD_SEND_DMA_CMD(1);\}\#defineLCD_DataWrite_S6D04H0(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_DATA,(_data&0xFF));\LCD_SEND_DMA_CMD(1);\}#defineLCD_CtrlWrite_CMD(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_CMD,((_data&0xFF00)8));\SET_LCD_CMD_PARAMETER(1,LCD_CMD,(_data&0x00FF));\LCD_SEND_DMA_CMD(2);\}\#defineLCD_DataWrite_CMD(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_DATA,((_data&0xFF00)8));\SET_LCD_CMD_PARAMETER(1,LCD_DATA,(_data&0x00FF));\LCD_SEND_DMA_CMD(2);\}#elif(defined(MAIN_LCD_9BIT_MODE))//定义9位#defineLCD_CtrlWrite_S6D04H0(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_CMD,((_data&0xFF00)7));\SET_LCD_CMD_PARAMETER(1,LCD_CMD,((_data&0xFF)1));\LCD_SEND_DMA_CMD(2);\}\#defineLCD_DataWrite_S6D04H0(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_DATA,((_data&0xFF00)7));\SET_LCD_CMD_PARAMETER(1,LCD_DATA,((_data&0xFF)1));\LCD_SEND_DMA_CMD(2);\}#elif(defined(MAIN_LCD_16BIT_MODE))//定义16位#defineLCD_CtrlWrite_S6D04H0(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_CMD,_data);\LCD_SEND_DMA_CMD(1);\}\#defineLCD_DataWrite_S6D04H0(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_DATA,_data&);\LCD_SEND_DMA_CMD(1);\}#elif(defined(MAIN_LCD_18BIT_MODE))//定义18位#defineLCD_CtrlWrite_S6D04H0(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_CMD,(((_data&0xFF00)2)|(_data&0xFF)1))\LCD_SEND_DMA_CMD(1);\}\#defineLCD_DataWrite_S6D04H0(_data)\{\SET_LCD_CMD_PARAMETER(0,LCD_DATA,(((_data&0xFF00)2)|(_data&0xFF)1));\LCD_SEND_DMA_CMD(1);\}#endif#else//非DMA方式#defineLCD_delay_S6D04H0()#if(defined(MAIN_LCD_8BIT_MODE))#defineLCD_CtrlWrite_S6D04H0(_data)\{\*(volatilekal_uint8*)MAIN_LCD_CMD_ADDR=((_data&0xFF00)8);\*(volatilekal_uint8*)MAIN_LCD_CMD_ADDR=(_data&0xFF);\LCD_delay_S6D04H0();\}\#defineLCD_DataWrite_S6D04H0(_data)\{\*(volatilekal_uint8*)MAIN_LCD_DATA_ADDR=((_data&0xFF00)8);\*(volatilekal_uint8*)MAIN_LCD_DATA_ADDR=(_data&0xFF);\LCD_delay_S6D04H0();\}#elif(defined(MAIN_LCD_9BIT_MODE))#defineLCD_CtrlWrite_S6D04H0(_data)\{\*(volatilekal_uint16*)MAIN_LCD_CMD_ADDR=((_data&0xFF00)7);\*(volatilekal_uint16*)MAIN_LCD_CMD_ADDR=((_data&0xFF)1);\LCD_delay_S6D04H0();\}\#defineLCD_DataWrite_S6D04H0(_data)\{\*(volatilekal_uint16*)MAIN_LCD_DATA_ADDR=((_data&0xFF00)7);\*(vola
本文标题:针对MTK平台下,LCD调试步骤以及常见的一些问题
链接地址:https://www.777doc.com/doc-5393419 .html