日本电子维修技术 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 电路 电子 维修 我现在把定影部分拆出来了。想换下滚,因为卡纸。但是我发现灯管挡住了。拆不了。不会拆。论坛里的高手拆解过吗? 评论 认真看,认真瞧。果然有收
 ·日本留学生活 求个大阪合租
·日本留学生活 自家房招租求
·日本留学生活 东京地区出9成新lv钱包
·日本育儿教育 孩子从国内过来如何学习日语
·日本育儿教育 明年四月横滨招月嫂
·日本育儿教育 请问咋让娃突破识字关?感谢分享中文共读和学习经验的妈妈
 ·中文新闻 东区明星迈克尔·格列柯,53 岁,将在第一次出生两年后第二次
·中文新闻 《爱情岛》明星卡米拉·瑟洛和杰米·朱维特在透露即将迎来第三

维修经验

CPUcpu-z 1.77版低调发布

日本维修技术更新: New benchmark “submit and compare” feature New clocks dialog reporting all system’s clock speeds in real-time Preliminary support for Intel Kaby Lake AMD Bristol Ridge processors 主要是增加了支持I、A两个新架构的 ...

维修经验

CPU这几天经常开机黑屏,热重启后又正常

日本维修技术这几天经常开机黑屏,热重启后又正常,今天热重启也不管用了。折腾半天总算点亮,显示超频失败,以前出这个画面我是不理它的,直接重启就能正常进系统了,今天不敢托大,因为 ...

维修经验

CPU超频求助!关于华擎H170和6700K

日本维修技术问题见楼主的show贴 https://www.chiphell.com/thread-1634895-1-1.html 这次华擎的H170 Hyper最大的特色应该是自带时钟发生器可以自由超外频 可是楼主好久没有折腾超频了。。。 两图中除了CPU外频 以 ...

维修经验

CPU液态金属会侵蚀cpu核心吗?

日本维修技术前阵子看到有人说,液态金属时间长了会侵蚀cpu铜盖,那么问题来了,这货会不会侵蚀核心呢? 评论 这玩意儿好像只对铝起反应 评论 不是说,cpu的盖子是铜的吗。。。 评论 不会,核 ...

维修经验

CPUm6i究竟支不支持e3 1231v3

日本维修技术官网上看支持列表没写有e3 1231v3,装机帖又有人晒,百度也没个明确答案,那究竟能不能点亮?有在用的chher说一下么 评论 升级最新bios肯定可以支持 评论 我的p67evo官网上也没说支持12 ...

维修经验

CPU华擎 HYPER 妖板 正确玩法

日本维修技术600元的 B150,10相供电,释放洪荒之力 注意必须官网 Beta 区的 BIOS 有 AVX 的 CPU 可能会掉缓存 启动时按 X 键激活 SKY OC,重启后进入 BIOS 160924164727.jpg (95.63 KB, 下载次数: 1) 2016-9-24 17:47 上传 ...

维修经验

CPUE5 2686 V3和i7 6800K如何选择

日本维修技术默认用,不超频,两者功耗是一模一样的 E5 2686 V3:2.0主频,3.5睿频, 18核心36线程 ,45M L3 咸鱼大约2500~3000元 i7 6800K : 3.5主频,3.8睿频 ,6核心12线程 ,盒装3000元 评论 性能应该是26 ...

维修经验

CPUHD530硬解4K能力还是有点弱呀!

日本维修技术播放器用PotPlay 64bit,各种优化后,跑4K @120Hz视频只能到70帧左右的速度,勉强能用! 显示器用的4K的优派VP2780 未标题-1.jpg (211.97 KB, 下载次数: 0) 2016-9-26 21:29 上传 评论 这个估计你没优化 ...

维修经验

CPU6900k 1.25V到4.2体质怎么样

日本维修技术如图,体质怎么样,ring是35,没敢试了,都说ring高了毁硬件 评论 不错的U,但不算雕,上4.4就大雕了,这电压上4.5的目前没见有人发图 评论 谢谢前辈告知 评论 我这个用1.2V超的4.2,R ...

维修经验

CPUI3 6100 华擎B150M pro4超4.5g测试。

日本维修技术看看论坛没多少i3 6100的帖子,就转下自己发的show贴里面的数据,给大家参考下。家里还有当年的神U i3 540 oc 4.5G在给老妈用。 不知道数据上正常吗?有6100的朋友可以告诉下,另外是不有 ...

维修经验

CPU7系u会兼容100系主板吗?

日本维修技术RT,听说要推200系板,100系还能用吗以后。。 评论 兼容的 评论 感谢!以后换u就行了,目前消息200系板会有新的特性吗? 评论 24条PCI-E 3.0通道、支持Intel Optane混合存储技术、十个USB 3 ...

维修经验

CPU有心入5820k了,求教下温度问题

日本维修技术一直徘徊在6700k和5820k之间,6700k现在这德行直接把我推向了5820k啊,从2600k升级上来,三大件都要换,现在唯一疑惑的是IB-E ex这种顶级风冷能不能压住4.5g的5820呢?毕竟刚刚买一个多月。 ...

维修经验

CPU6600&amp;6600K才100的差价

日本维修技术太少了吧。。。 6600.JPG (106.91 KB, 下载次数: 0) 2016-10-1 10:30 上传 评论 毕竟只是i5而已…… 评论 上z170 6600也能超,等于没区别,差价能有100已经不错了 评论 然后又见不超频人士推荐超频 ...