详解LCD移植
1. Make文件设置设置LCD
LCD_MODULE = BROADMOBI68_09B_LCM //这个名字可以
自己取,但是//这个名字要和\\custom\\drv\\LCD\\下的文件夹一致。
//一般可以不用改。到时直接修改这个文件夹下的代码就行了。
# Based on the LCM solutions (even multiple LCM modules for this project)
# SHOULD BE ONE OF THE FOLLOWINGS, based on the LCM # MTKLCM - Mono, 102x64
# MTKLCM_COLOR - Color, 120x160, for MT6218_MW001 or MT6205_CEVB
# ORDNANCELCM - Mono, 112x64 # KLMLCM - Color, 128x128
# INFOLCM - Color, 128x128
# TOPPOLY_LCM - Color, 128x160, for MT6218B_EVB # SONY_LCM
MAIN_LCD_SIZE = 320X480 //查LCD datasheet可以查到分辨率。
# To distinguish the main lcd size.
# We can use it to copy the matching resources, such themecomponents.h, Fontres.c, L_xxx.h, etc, to PLUTO_MMI folder
SUB_LCD_SIZE = NONE
# NONE, 48X64BW, 64X96, 96X64BW, 96X64, 128X128 COM_DEFS_FOR_BROADMOBI68_09B_LCM = BROADMOBI68_09B_LCM
TFT_MAINLCD //如果//上面的LCD_MOULE设置改了,这个就要跟着该。
# TFT_MAINLCD – LCD类型
驱动代码:
mcu\\custom\\drv\\LCD\\$( LCD_MODULE)\\lcd.c mcu\\custom\\drv\\LCD\\$( LCD_MODULE)\\lcd_hw.h mcu\\custom\\drv\\LCD\\$( LCD_MODULE)\\lcd_sw.h mcu\\custom\\drv\\LCD\\$( LCD_MODULE)\\lcd_sw_inc.h mcu\\custom\\drv\\LCD\\$( LCD_MODULE)\\lcd_rnd.h 2. 驱动开发。
a. 打开关闭DMA模式。
文件:mcu\\custom\\drv\\LCD\\$( LCD_MODULE)\\lcd_sw.h #if
(defined(MT6226)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6268T)||defined(MT6230)||defined(MT6235)||defined(MT6235B)||defined(MT6238)||defined(MT6268A)||defined(MT6239)||defined(MT6268))
#define LCD_CMD_DMA_MODE //如果不需要则注解掉。一般打开,这样速度快。
#define LCD_DUMMYADDR 0x90000000 ……
b. 设置LCD Bus Width。
这个定义要根据硬件上IM3~IM0的接法,具体查LCD datasheet。比如:
看上图,IM3~IM0=”1010”,所以要如下定义: #define MAIN_LCD_18BIT_MODE
c. 根据LCD参数设置主屏Command/Data Address.
查LCD Datasheet可以看到:
这里叫D/CX,也有叫RS的,反正是CMD和DATA的选择信号。看上图1为数据,0为命令,所以要做如下定义:
#define MAIN_LCD_CMD_ADDR LCD_PARALLEL0_A0_LOW_ADDR
#define MAIN_LCD_DATA_ADDR
LCD_PARALLEL0_A0_HIGH_ADDR
//LCD_PARALLEL0_A0_LOW_ADDR/ LCD_PARALLEL0_A0_HIGH_ADDR在
//lcd_if_xxxx_serials_hw.h中被定义,路径位于mcu\\interface\\hwdrv。具体使用那个文件//里的定义,请参考lcd_if_hw.h文件内容。
d. 设置color format
一般一个lcd,比如说有18bit的总线,但是根据IM3~IM0的接法,可以调整到8/9/16/18四种总线接法。但是呢,实际上肯定是18bit的接法,不然就浪费了,不让用这么好的屏干嘛啊,意思是一般都会用最大的总线支持的颜色类型。然后查lcd,可以查到:
Full color mode位262K色,所以应定义LCM_18BIT_18_BPP_RGB666_1(666=2的6次方乘3次,就是262K色)
#if (defined(MAIN_LCD_8BIT_MODE))
#define MAIN_LCD_OUTPUT_FORMAT LCM_8BIT_16_BPP_RGB565_1
#elif (defined(MAIN_LCD_9BIT_MODE)) #define MAIN_LCD_OUTPUT_FORMAT LCM_9BIT_18_BPP_RGB666_1
#elif (defined(MAIN_LCD_16BIT_MODE)) #define MAIN_LCD_OUTPUT_FORMAT LCM_16BIT_16_BPP_RGB565_1
#elif (defined(MAIN_LCD_18BIT_MODE))
//18位总线下最大支持RGB666,也就是262K色。 #define MAIN_LCD_OUTPUT_FORMAT
LCM_18BIT_18_BPP_RGB666_1 #endif
// LCM_8BIT_16_BPP_RGB565_1这些值在lcd_if.h中被定义。 e. 设置Sub LCD的参数—和上面主屏一样的方法。
#ifdef DUAL_LCD #ifdef SERIAL_SUBLCD
#define SUB_LCD_CMD_ADDR LCD_SERIAL0_A0_LOW_ADDR
#define SUB_LCD_DATA_ADDR LCD_SERIAL0_A0_HIGH_ADDR #else
#define SUB_LCD_CMD_ADDR LCD_PARALLEL1_A0_LOW_ADDR
#define SUB_LCD_DATA_ADDR LCD_PARALLEL1_A0_HIGH_ADDR #endif
#if (defined(SUB_LCD_8BIT_MODE)) #define SUB_LCD_OUTPUT_FORMAT LCM_8BIT_16_BPP_RGB565_1
#elif (defined(SUB_LCD_9BIT_MODE)) #define SUB_LCD_OUTPUT_FORMAT LCM_9BIT_16_BPP_RGB565_1
#elif (defined(SUB_LCD_16BIT_MODE)) #define SUB_LCD_OUTPUT_FORMAT LCM_16BIT_16_BPP_RGB565_1
#elif (defined(SUB_LCD_18BIT_MODE)) #define SUB_LCD_OUTPUT_FORMAT LCM_18BIT_18_BPP_RGB666_1 #endif #endif
f. 实现LCD_CtrlWrite_XXX/ LCD_DataWrite_XXX函数。
LCD_DataWrite_XXX 和 LCD_CtrlWrite_XXX一样。所以只说LCD_CtrlWrite_XXX是如何实现的。
首先要明白我们的寄存器一般都是16位数据的,但是我们现在的总线接法有8位,9位,16位,18位这四种。这个函数的功能就是要将寄存器的数据送到总线上去。很显然,8位和9位的总线无法一次性将寄存器的数据获取,所以要分2次进行。而16位和18位就可以一次将寄存器的数据获取。
8位:分2次,先传高八位,然后传低8位。 #define LCD_CtrlWrite_XXX(_data) \\ {\\
SET_LCD_CMD_PARAMETER(0,LCD_CMD,((_data & 0xFF00)>>8));
SET_LCD_CMD_PARAMETER(1,LCD_CMD,(_data & 0xFF));