MT6250/50D串口屏移植说 明/6250 Serial LCM AppNote
0赞[DESCRIPTION]
如何快速的将MT6252上使用过的serial LCM Driver移植到MT6250上使用。
[SOLUTION]
Step By Step
以LSCE0B做片选为例。
以下仅介绍与MT6252上串口代码有区别的地方。
1. 根据电路图,使用Drv_tool 在DWS里进行配置,如下仅是一组示例:
GPIO39->LSDA02 serial data pin
GPIO40->LSA0DA13 serial A0 pin
GPIO41->LSCK2 serial clock pin
GPIO46->LSCE0B serial CS pin
GPIO48->LSRSTB serial reset pin
2. lcd_sw.h里CMD Address和Data Address应该配置成Serial0(CS连接的是LSCE0B).
#define MAIN_LCD_CMD_ADDR LCD_SERIAL0_A0_LOW_ADDR
#define MAIN_LCD_DATA_ADDR LCD_SERIAL0_A0_HIGH_ADDR
3. 在lcd_sw.h中定义3wire还是4 wire
#define SERIAL_LCM_4WIRE_1_DATA_LANE // 当使用4 wire LCM时定义此宏
#define SERIAL_LCM_3WIRE_1_DATA_LANE // 当使用3 wire LCM时定义此宏
4. 在lcd_sw.h中实现CtrlWrite和DataWrite,注意:50不需要手动去拉CS信号,使用上和并口屏差不多.另外,因为
50的代码都是11B的,所以建议客户使用非CMD DMA的方式。
Volatile kal_uint32 ranesis_delay;
#ifdef LCD_CMD_DMA_MODE
#define LCD_SEND_DMA_CMD(n)
{\
Volatile kal_uint32 I;\
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; i<50; i++) {};\
while(LCD_IS_RUNNING) {};\
}
#if (defined(MAIN_LCD_8BIT_MODE))
#define LCD_CtrlWrite_XXXX(_data) \
{\
SET_LCD_SERIAL0_IF_SIZE(LCD_SCNF_IF_WIDTH_8);\
SET_LCD_CMD_PARAMETER(0,LCD_CMD,(_data & 0x00FF)); \
LCD_SEND_DMA_CMD(1); \
}
#define LCD_DataWrite_XXXX(_data) \
{\
SET_LCD_SERIAL0_IF_SIZE(LCD_SCNF_IF_WIDTH_8);\
SET_LCD_CMD_PARAMETER(0,LCD_DATA,(_data & 0x00FF)); \
LCD_SEND_DMA_CMD(1); \
}
#endif
#else
#if (defined(MAIN_LCD_8BIT_MODE))
#define LCD_CtrlWrite_ XXXX (_data) \
{\
SET_LCD_SERIAL0_IF_SIZE(LCD_SCNF_IF_WIDTH_8);\
*((volatile kal_uint16 *)MAIN_LCD_CMD_ADDR) = (_data&0x00FF);\
for(ranesis_delay = 20; ranesis_delay > 0; ranesis_delay--);\
}
#define LCD_DataWrite_ XXXX (_data) \
{\
SET_LCD_SERIAL0_IF_SIZE(LCD_SCNF_IF_WIDTH_8);\
*((volatile kal_uint16 *)MAIN_LCD_DATA_ADDR) = (_data&0x00FF);\
for(ranesis_delay = 20; ranesis_delay > 0; ranesis_delay--);\
}
#endif
#endif
5. Lcd.c中init_lcd_interface() 这里面涉及的一些宏在lcd_if_6250_series_hw.h中有定义
void init_lcd_interface(void)
{
#if defined(MT6250)
#if !defined(FPGA)
/// Turn on LCD clock
#if defined(__OLD_PDN_DEFINE__)
DRV_Reg(DRVPDN_CON1_CLR) = DRVPDN_CON1_LCD;
//modifed for new clock gating
#elif defined(__CLKG_DEFINE__)
DRV_Reg(MMCG_CLR0) = MMCG_CON0_LCD;
#endif
#endif
//Serial Clock:
SET_LCD_SERIAL_CLOCK(0, LCD_SERIAL_CLOCK_104MHZ); //此处选择serial lcm的clock
DISABLE_LCD_SERIAL0_SINGLE_A0;
DISABLE_LCD_SERIAL0_CS_STAY_LOW;
ENABLE_LCD_SERIAL0_CS_STAY_LOW; // pixel data传输时,CS保持为low
//Define serial LCM work mode here,需要在lcd_sw.h中定义相应的宏
#if (defined(SERIAL_LCM_4WIRE_1_DATA_LANE)) // 4 wire时开启
DISABLE_LCD_SERIAL0_3WIRE;
#elif defined(SERIAL_LCM_3WIRE_1_DATA_LANE) //3 wire时开启
ENABLE_LCD_SERIAL0_3WIRE;
DISABLE_LCD_SERIAL0_SDI;
#endif
ENABLE_LCD_SERIAL_IF_HW_CS; //HW CS
#if defined(MAIN_LCD_16BIT_MODE)
SET_LCD_SERIAL0_IF_SIZE(LCD_SCNF_IF_WIDTH_16);
#elif defined(MAIN_LCD_18BIT_MODE)
SET_LCD_SERIAL0_IF_SIZE(LCD_SCNF_IF_WIDTH_18);
#elif defined(MAIN_LCD_8BIT_MODE)
SET_LCD_SERIAL0_IF_SIZE(LCD_SCNF_IF_WIDTH_8);
#endif
//Timing need tuning
SET_LCD_SERIAL_IF_CSS(0, 1); //
SET_LCD_SERIAL_IF_CSH(0, 1);
SET_LCD_SERIAL_IF_WR_1ST(0,0);//
SET_LCD_SERIAL_IF_WR_2ND(0,0);
SET_LCD_SERIAL_IF_RD_1ST(0,0);//
SET_LCD_SERIAL_IF_RD_2ND(0,0);
SET_LCD_SERIAL0_IF_SIZE(LCD_SCNF_IF_WIDTH_8);//CMD use 8 bit width
//Set Driving current
set_lcd_driving_current(LCD_DRIVING_4MA);
#endif
} /* init_lcd_interface() */
6. Lcd.c中 Blockwrite()
需要注意的是MT6250上BlockWrite函数里不需要手动去拉CS. BlockWrite函数如下:
注意掉红色语句。
void LCD_BlockWrite_xxxx(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)
{
kal_uint16 start_x,start_y,end_x,end_y;
kal_uint16 lcdx,lcdy;
start_x = startx;
start_y = starty;
end_x = endx;
end_y = endy;
ASSERT(lcd_assert_fail==KAL_FALSE);
lcd_assert_fail = KAL_TRUE;
//TRACE_P0("LCD_BlockWrite_XXXX",1);
#ifdef LCD_CMD_DMA_MODE
//ENABLE_LCD_SERIAL0_CS;
SET_LCD_CMD_PARAMETER(0,LCD_CMD,0x2A);
SET_LCD_CMD_PARAMETER(1,LCD_DATA,(startx & 0xFF00)>>8);
SET_LCD_CMD_PARAMETER(2,LCD_DATA,(startx & 0xFF));
SET_LCD_CMD_PARAMETER(3,LCD_DATA,(endx & 0xFF00)>>8);
SET_LCD_CMD_PARAMETER(4,LCD_DATA,(endx & 0xFF));
SET_LCD_CMD_PARAMETER(5,LCD_CMD,0x2B);
SET_LCD_CMD_PARAMETER(6,LCD_DATA,(starty & 0xFF00)>>8);
SET_LCD_CMD_PARAMETER(7,LCD_DATA,(starty & 0xFF));
SET_LCD_CMD_PARAMETER(8,LCD_DATA,(endy & 0xFF00)>>8);
SET_LCD_CMD_PARAMETER(9,LCD_DATA,(endy & 0xFF));
SET_LCD_CMD_PARAMETER(10,LCD_CMD,0x2C);
SET_LCD_ROI_CTRL_NUMBER_OF_CMD(11);
ENABLE_LCD_TRANSFER_COMPLETE_INT;
ENABLE_LCD_ROI_CTRL_CMD_FIRST;
START_LCD_TRANSFER;
//while(LCD_BUSY){};
//DISABLE_LCD_SERIAL0_CS;
#else
半导体社区
