日本电子维修技术 MTK平台屏驱动基本介绍
大家平时在刷MTK的机时,很多时候刷完开机出现白屏现象
下面介绍下屏的驱动,有C语言基础可以尝试下自己动手解决屏驱动问题
一:LCD
文件位于custom\drv\LCD
以华立维的一款240X320的屏为例介绍如何添加LCD驱动
gprs.mak
LCD_MODULE = HUALIWEI_SSD1289_LCM
MAIN_LCD_SIZE = 240X320
Option
COM_DEFS_FOR_HUALIWEI_SSD1289_LCM = HUALIWEI_SSD1289_LCM SSD1289 COLOR_LCD TFT_MAINLCD QVGA_MAINLCD
在custom\drv\LCD添加HUALIWEI_SSD1289_LCM文件夹,下面有5个文件。文件名同MTK系统自带的(lcd.c lcd_hw.h lcd_sw.h lcd_sw_inc.h lcd_sw_rnd.h)。
HUALIWEI--------------屏的厂家
SSD1289-----------------屏的驱动芯片
LCM----------------------屏
240X320-----------------屏的分辨率
COLOR_LCD----------彩色
TFT_MAINLCD-------屏的类型,对应的还有CSTN,OLED。目前主要是TFT
QVGA_MAINLCD----屏的分辨率
做了上述修改以后,编译时,lcd驱动就对应HUALIWEI_SSD1289_LCM文件夹里的驱动。文件夹里的5个文件,通常lcd_hw.h, lcd_sw_rnd不需要修改。lcd_sw_inc.h只是定义屏的分辨率。如下:
#ifdef __MMI_MAINLCD_1
28X128__
#define LCD_WIDTH 128
#define LCD_HEIGHT 128
#elif (defined(__MMI_MAINLCD_128X160__))
#define LCD_WIDTH 128
#define LCD_HEIGHT 160
#elif (defined(__MMI_MAINLCD_176X220__))
#define LCD_WIDTH 176
#define LCD_HEIGHT 220
#elif (defined(__MMI_MAINLCD_240X320__))
#define LCD_WIDTH 240
#define LCD_HEIGHT 320
#endif
#define UI_DEVICE_WIDTH LCD_WIDTH
#define UI_DEVICE_HEIGHT LCD_HEIGHT
修改比较多的是lcd.c和lcd_sw.h。
Lcd_sw.h
#define LCD_CMD_DMA_MODE---------是否使用DMA方式?(DMA简单,速度快,通过MTK的寄存器进行操作,但灵活性差。非DMA方式,直接对地址操作,灵活性好,但速度会有影响。目前,一般都是用DMA方式)
#define LCD_16BIT_MODE-----------------lcd使用16位总线?(由硬件决定)
/*通过A0来区分处理器向lcd写的是命令还是数据。由硬件决定*/
#define LCD_SSD1289_CTRL_ADDR LCD_PARALLEL0_A0_LOW_ADDR
#define LCD_SSD1289_DATA_ADDR LCD_PARALLEL0_A0_HIGH_ADDR
#define MAIN_LCD_CMD_ADDR LCD_SSD1289_CTRL_ADDR/*写的是命令*/
#define MAIN_LCD_DATA_ADDR LCD_SSD1289_DATA_ADDR/*写的是数据*/
#define MAIN_LCD_OUTPUT_FORMAT LCM_16BIT_16_BPP_RGB565_1
/*与总线匹配 16-5(R)+6(G)+5(B)*/
/***********************SSD1289********************************/
#define LCD_delay_SSD1289() \
{\
volatile kal_uint16 iI; \
for (iI = 0; iI < 0x20; iI++);\
}
#ifdef LCD_CMD_DMA_MODE-------------DMA方式
#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的信号)
Lcd.c
LCD_Funcs LCD_func_SSD1289 = {
LCD_Init_SSD1289,
LCD_PWRON_SSD1289,
LCD_SetContrast_SSD1289,
LCD_ON_SSD1289,
LCD_BlockWrite_SSD1289,
LCD_Size_SSD1289,
LCD_EnterSleep_SSD1289,
LCD_ExitSleep_SSD1289,
LCD_Partial_On_SSD1289,
LCD_Partial_Off_SSD1289,
LCD_Partial_line_SSD1289,
/*Engineering mode*/
LCD_GetParm_SSD1289,
LCD_SetBias_SSD1289,
LCD_Contrast_SSD1289,
LCD_LineRate_SSD1289,
LCD_Temp_Compensate_SSD1289
#ifdef __LCD_ESD_RECOVERY__
,LCD_ESD_check_SSD1289
#endif
};
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);
LCD_CtrlWrite_SSD1289(0x0003);
LCD_DataWrite_SSD1289(0xa8a4);
…………………
}
/*这个函数就是将一块特定区域的数据显示到LCD上
startx------X起始点坐标 starty------Y起始点坐标
endx-------X结束点坐标 endy-------Y结束点坐标*/
void LCD_BlockWrite_SSD1289(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)
{
…………………….
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调试,特殊的不做描述。
在硬件没有问题的情况下,lcd没有点亮,可做如下动作:
1) 在LCD_Init_SSD1289()函数下加
{
lcd_drive_ic_id = LCD_DataRead_SSD1289;
/*看读出来的lcd数据是否正确,判断处理器和lcd的通讯是否正常*/
}
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()。这个时候,屏上应该有显示了。只是显示不正常。 电路 电子 维修 求创维42c08RD电路图 评论 电视的图纸很少见 评论 电视的图纸很少见 评论 创维的图纸你要说 版号,不然无能为力 评论 板号5800-p42ALM-0050 168P-P42CLM-01 电路 电子 维修 我现在把定影部分拆出来了。想换下滚,因为卡纸。但是我发现灯管挡住了。拆不了。不会拆。论坛里的高手拆解过吗? 评论 认真看,认真瞧。果然有收
·日本中文新闻 唐田绘里香为新剧《极恶女王》剃光头 展现演员决心
·日本中文新闻 真子小室夫妇新居引发隐私担忧
·日本中文新闻 前AKB48成员柏木由纪与搞笑艺人交往曝光
·日本学校 {日本国际学校}梅田インターナショナルスクール
·日本学校 LINE:sm287 陳雨菲、20歳、台湾からの留学生、東京に来たばかり
·日本留学生活 出售平成22年走行48000km 代步小车
·日本华人网络交流 円相場 一時1ドル=140円台まで上昇?
·日本华人网络交流 问日本华人一个问题
·日本旅游代购 富山接机
·生活百科 英国转澳大利亚转换插头
·汽车 【求助】修车遇到困难怎么办?