MTK feature phone LCD调试方法

参考资料:

IC Datasheet (寄存器说明书),屏的规格书(打样),项目原理图(比对PIN脚定义,屏规格书需要与与此一致)。

如何添加LCD驱动:

1.gprs.mak修改以下部分:

LCD_MODULE = HUALIWEI_SSD1289_LCM

COM_DEFS_FOR_HUALIWEI_SSD1289_LCM = HUALIWEI_SSD1289_LCM SSD1289 COLOR_LCD TFT_MAINLCD QVGA_MAINLCD


2.在custom/drv/LCD添加HUALIWEI_SSD1289_LCM文件夹,下面有5个文件。文件名同MTK系统自带的(lcd.c lcd_hw.h lcd_sw.h lcd_sw_inc.h lcd_sw_rnd.h)。

做了上述修改以后,编译时,lcd驱动就对应HUALIWEI_SSD1289_LCM文件夹里的驱动。文件夹里的5个文件,通常lcd_hw.h, lcd_sw_rnd不需要修改。


3.Lcd_sw.h修改(修改比较多的是lcd.c和lcd_sw.h):

3.1 写方式:DMA方式还是一般方式

#define LCD_CMD_DMA_MODE

备注:

DMA简单,速度快,通过MTK的寄存器进行操作,可以连续写入多个指令和数据,但灵活性差。

非DMA方式,直接对地址操作,灵活性好,但速度会有影响。

目前,一般都是用DMA方式。


3.2 lcd使用总线位数

16、8、18位总线?(由硬件原理图设计决定) 

#define LCD_16BIT_MODE

//#define LCD_8BIT_MODE

//#define LCD_18BIT_MODE


3.3颜色输出格式

#define MAIN_LCD_OUTPUT_FORMAT LCM_16BIT_16_BPP_RGB565_1  

 

#ifdef LCD_CMD_DMA_MODE

#define LCD_SEND_DMA_CMD(n) /

{/

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;/

while (LCD_IS_RUNNING);/

}

 

#define LCD_CtrlWrite_SSD1289(_data) /

{/

SET_LCD_CMD_PARAMETER(0, LCD_CMD, _data);/ --------写的是命令

LCD_SEND_DMA_CMD(1);/

}

#define LCD_DataWrite_SSD1289(_data) /

{/

SET_LCD_CMD_PARAMETER(0, LCD_DATA, _data);/ --------写的是数据

LCD_SEND_DMA_CMD(1);/

}

备注:写指令、写数据通过片选高、低来切换写。

#else ----------非DMA方式

#define LCD_CtrlWrite_SSD1289(_data) /

{/

*(volatile kal_uint32 *) LCD_SSD1289_CTRL_ADDR = _data;/ --------写的是命令

LCD_delay_SSD1289();/

}

 

#define LCD_DataWrite_SSD1289(_data) /

{/

*(volatile kal_uint32 *) LCD_SSD1289_DATA_ADDR = _data;/------------写的是数据

LCD_delay_SSD1289();/

}

#endif

 

#define LCD_DataRead_SSD1289 (*(volatile kal_uint16 *)LCD_SSD1289_DATA_ADDR);

------用于读LCD id,兼容lcd用。(这个需要硬件上接读lcd的信号) 

 

4.Lcd.c文件中修改:

void LCD_FunConfig(void)

{

MainLCD = &LCD_func_SSD1289;

上层通过这个LCD_func_SSD1289来调用相应的lcd驱动函数的。这个结构体里的很多函数不需要修改(注意与基线版本保持一致,避免异常)。

经常需要修改的有以下几个函数:

LCD_Init_SSD1289(), LCD_BlockWrite_SSD1289(), LCD_EnterSleep_SSD1289(),LCD_ExitSleep_SSD1289()。

这其中,LCD_Init_SSD1289(), LCD_EnterSleep_SSD1289(), LCD_ExitSleep_SSD1289(),屏厂会提供,只需要按照写就可以了。

LCD_BlockWrite_SSD1289()需要根据LCD的datasheet写。

见ssd1289+2.2topsun-init.txt

LCD_Init_SSD1289()

{

……………….

LCD_CtrlWrite_SSD1289(0x0000);

LCD_DataWrite_SSD1289(0x0001);

…………………

void LCD_BlockWrite_SSD1289(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)

{

:BlockWrite函数,只要屏有数据就会刷新,时刻刷新。

:需要根据屏的datasheet来写此部分代码。

…………………….

SET_LCD_CMD_PARAMETER(0,LCD_CMD, 0x4E); ---------表示寄存器

SET_LCD_CMD_PARAMETER(1,LCD_DATA, startx); ----------表示寄存器中的值

SET_LCD_CMD_PARAMETER(2,LCD_CMD, 0x4F);

SET_LCD_CMD_PARAMETER(3,LCD_DATA, starty);

SET_LCD_CMD_PARAMETER(4,LCD_CMD, 0x44);

SET_LCD_CMD_PARAMETER(5,LCD_DATA, (((endx & 0x00ff)<<8) | (startx & 0x00ff)));

SET_LCD_CMD_PARAMETER(6,LCD_CMD, 0x45);

SET_LCD_CMD_PARAMETER(7,LCD_DATA, starty);

SET_LCD_CMD_PARAMETER(8,LCD_CMD, 0x46);

SET_LCD_CMD_PARAMETER(9,LCD_DATA, endy);

 

SET_LCD_CMD_PARAMETER(10,LCD_CMD, 0x22);

 

ENABLE_LCD_TRANSFER_COMPLETE_INT;

ENABLE_LCD_ROI_CTRL_CMD_FIRST;

SET_LCD_ROI_CTRL_NUMBER_OF_CMD(11);

START_LCD_TRANSFER;

具体的寄存器意义,见datasheet SSD1289_1.1.pdf (P51)datasheet。这个是一般的lcd调试,特殊的不做描述。

 

5.在硬件没有问题的情况下,lcd没有点亮,可做如下动作:

1) 在LCD_Init_SSD1289()函数下加

{

lcd_drive_ic_id = LCD_DataRead_SSD1289; 

}

2) LCD_Init_SSD1289()增大lcd复位时间

{

SET_LCD_CTRL_RESET_PIN;

LCD_Delay100us(1000);

CLEAR_LCD_CTRL_RESET_PIN;

LCD_Delay100us(1000);

SET_LCD_CTRL_RESET_PIN;

LCD_Delay100us(1000);

}

3) LCD_Init_SSD1289()添加测试代码

{

{

unsigned int m,n;

GPIO_ModeSetup(25, 0);

GPIO_InitIO(1, 25);

GPIO_WriteIO(1, 25);

for(m=0; m<240; m++)

for(n=0; n<320; n++)

{

LCD_DataWrite_SSD1289(0xf800);//全屏刷新红色用于判断初始化代码是否正确

}

}

}

4) 修改时序,主要是写的时序void init_lcd_interface(void)

{

SET_LCD_PARALLEL_CE2WR_SETUP_TIME((kal_uint32)3);

SET_LCD_PARALLEL_CE2WR_HOLD_TIME(4);

SET_LCD_PARALLEL_CE2RD_SETUP_TIME(3);

SET_LCD_PARALLEL_WRITE_WAIT_STATE(7);

SET_LCD_PARALLEL_READ_LATENCY_TIME(31);

SET_LCD_ROI_CTRL_CMD_LATENCY(10);

}

备注:一般情况下,基线平台的时序不需要做修改,保持稳定,避免出现新的问题。

5) 初始化正确的前提下,检查函数LCD_BlockWrite_SSD1289()。这个时候,屏上应该有显示了。只是显示不正常。

你可能感兴趣的:(MTK feature phone LCD调试方法)