屏就是一个设备,我们在给它上电后,它需要有一段时间后才启动完毕,对于大多数屏来讲,这个时间都比较短,一般要求大于几十毫秒,之后我们就可以给它送Data & Clock;
当它收到我们的信号后,它开始要安排输出,这个准备的时间会比较长,不同的屏差异也比较大,普遍是在800ms~1400ms。在这个时间里,
我们不能将背光打开,否则就会看到各种闪线或是花屏。这两个delay 数据都可以从屏的规格书里找到。
Mstar panel ,VB1上电是分开的,但是针对不同的屏 时,时序有差异,也就是这两者的启动时间间隔是不一样的,下面我们分享一下调试经验。
Panel/VB1 连接
从硬件原理图上看,panel on/off 由pin D2 控制;VB1 由pin E4 控制。
这两个PIN都属于简单的GPIO口,只需要配置为输出模式,通过高低电平来控制外设。
软件配置
原理图上面的pin 在board 信息里面定义,E4,D2如下:
#define BALL_E4 PAD_GPIO0_PM
#define PAD_GPIO0_PM 6
#define GPIO_PAD_6 GPIO5
#ifndef BALL_E4_IS_GPIO
#define BALL_E4_IS_GPIO 0
#endif
#ifndef PAD_GPIO0_PM_IS_GPIO
#define PAD_GPIO0_PM_IS_GPIO BALL_E4_IS_GPIO
#endif
#define BALL_D2 PAD_SAR2
#define PAD_SAR2 32
#define GPIO_PAD_32 GPIO31
#ifndef BALL_D2_IS_GPIO
#define BALL_D2_IS_GPIO 0
#endif
#ifndef PAD_SAR2_IS_GPIO
#define PAD_SAR2_IS_GPIO BALL_D2_IS_GPIO
#endif
@ vendor\mstar\supernova\projects\board\m7221\ChipInfo\MSD96BUXM8.h
有了pin 的定义,我们就可以定义其功能,状态。
- mboot 配置
//Panel
#define PAD_SAR2_IS_GPIO GPIO_OUT_LOW //PANEL_ON/OFF(L: Panel OFF H: Panel ON)
//VBL_CTRL
#define PAD_GPIO0_PM_IS_GPIO GPIO_OUT_LOW //H : BACKLIGHT OFF ,L : BACKLIGHT ON ,
@ vendor\mstar\mboot\MBoot\sboot\inc\M7221\board\BD_MST160D_AH_M7221.h
mboot 里面配置D2 为输出模式且默认输出Low状态,E4 也是为输出模式默认输出Low 状态
- supernova 配置
static GPIOInfo_t Board_GPIO_Setting[BOARD_GPIO_NUM] = {
......
// panel on/off
{PANEL_CTL, 0, PAD_SAR2}, //PANEL_ON/OFF
// VB CTRL
{INV_CTL, 0, PAD_GPIO0_PM},
......
}
@vendor\mstar\supernova\projects\board\m7221\serials\MST160D_10ABQM_18443_DTMB_AH\Board.h
在supernova 中配置完成以后,就通过PANEL_CTL,INV_CTL来控制着两个GPIO状态。
- 状态控制
void mapi_display::InternalOnOff(MAPI_BOOL bOn)
{
MAPI_U32 delayTime;
mapi_gpio *gptr1 = mapi_gpio::GetGPIO_Dev(INV_CTL);
mapi_gpio *gptr2 = mapi_gpio::GetGPIO_Dev(PANEL_CTL);
if(bOn)
{
// Avoid duplicate turn on
if (gptr1 != NULL && gptr2 != NULL)
{
if (gptr1->GetDevOnOff() && gptr2->GetDevOnOff())
{
printf("Panel/Backlight already on, just return!\n");
return;
}
}
if (gptr2 != NULL)
{
/* enable VCC */
gptr2->SetOn();
}
delayTime = g_IPanel.OnTiming(E_APIPNL_POWER_TIMING_1);
OS_DELAY_TASK(delayTime);
g_IPanel.Enable(bOn);
#if (ENABLE_LITE_SN == 0)
#if (MSTAR_TVOS ==1 )
if(mapi_display::Get_bootlogo_display() == FALSE)
{
MAPI_U16 u16SwingLevel = mapi_syscfg_fetch::GetInstance()->GetSwingLevel();
MApi_PNL_Control_Out_Swing(u16SwingLevel);
}
#endif
#endif
delayTime = g_IPanel.OnTiming(E_APIPNL_POWER_TIMING_2);
OS_DELAY_TASK(delayTime);
if (gptr1 != NULL)
{
/*enable VCC backlight*/
gptr1->SetOn();
}
}
else
{
if (gptr1 != NULL)
{
/*disable VCC backelight*/
gptr1->SetOff();
}
delayTime = g_IPanel.OffTiming(E_APIPNL_POWER_TIMING_1);
OS_DELAY_TASK(delayTime);
g_IPanel.Enable(bOn);
delayTime = g_IPanel.OffTiming(E_APIPNL_POWER_TIMING_2);
OS_DELAY_TASK(delayTime);
if (gptr2 != NULL)
{
/*disable VCC */
gptr2->SetOff();
}
}
}
@\vendor\mstar\supernova\MStarSDK\src\display\mapi_display.cpp
mapi_gpio::GetGPIO_Dev 分别获取两个GPIO的控制指针,
- 首先判断屏和背光是否已经全部打开;
- 如果打开则返回,反之进入下一步;
- 先拉高D2,进行屏供电;
- 中间通过OnTiming,分别给屏两个时序控制;
// E_APIPNL_POWER_TIMING_1,E_APIPNL_POWER_TIMING_2 - 时序给完之后,拉高E4,背光打开;
时序调整
上面是标准的屏上电,背光开启的流程。针对不同屏的时序调试,需要通过屏参文件的参数进行调整
###########################
# Output tmming setting #
###########################
.............
m_wPanelOnTiming1 = 30;
m_wPanelOnTiming2 = 200;
m_wPanelOffTiming1 = 220;
m_wPanelOffTiming2 = 10;
.............
在panel VCC 上电到 panel data&clock 过程中,给时序m_wPanelOnTiming1; 在paneldata&clock到 打开背光的过程中
给时序m_wPanelOnTiming2。
m_wPanelOffTiming1,m_wPanelOffTiming2 为关机断电时序参数。
在应用上通过apiPNL.h中定义api g_IPanel.OnTiming,g_IPanel.OffTiming来设定。