之前只在mtk的平台上做过,所以拿到三星的4418&6818时是无比懵逼的。这两个平台没有设备树~~~代码有点乱吧,至少对于第一次做三星的来说是乱的。废话不多说。
平台:4418&6818
设备:mipi屏
前面花了一周的时间帮硬件排查问题的过程就不说了,心累。
在确认硬件没有问题之后开始看为什么还是点不亮屏。
clock有,data0有,reset有,各种主板端供出的电都正常,但是为什么还是点不亮呢?
初始化序列?
不可能啊,我当时就坐在fae的公司,他帮我确认了若干遍,并且用示波器和逻辑分析仪都把屏幕端接收的数据读出来对比了,没有错误。
上电时序?
按照fae给的上电时序是上电的,其中delay的时间也是在建议值范围之内。没有问题啊。
之后在一次操作中把reset初始化就拉高,或者只拉高不做高低高,发现屏幕可以亮,但是···有50%几率不亮。
遇到这种情况是疯了,还是要查原因啊。
高潮来了,fae最后慢慢排查我们的上电流程发现,现在中控发出的mipi居然是直接进入HS模式,根据fae的描述他们家的屏幕必须在初始化上电是先进入LP模式,当初始化完才能进入HS,接收video信号。
找呗。
在display_mipi.c中:
static int disp_mipi_setup(int module, int input, struct disp_vsync_info *psync, struct disp_mipi_param *pmipi)
{
int index = 0;
int clkid = DISP_CLOCK_MIPI;
int width = psync->h_active_len;
int height = psync->v_active_len;
int ret = 0;
int i=0;
int HFP = psync->h_front_porch;
int HBP = psync->h_back_porch;
int HS = psync->h_sync_width;
int VFP = psync->v_front_porch;
int VBP = psync->v_back_porch;
int VS = psync->v_sync_width;
unsigned int pllpms = pmipi->pllpms;
unsigned int bandctl = pmipi->bandctl;
unsigned int pllctl = pmipi->pllctl;
unsigned int phyctl = pmipi->phyctl;
switch (input) {
case DISP_DEVICE_SYNCGEN0: input = 0; break;
case DISP_DEVICE_SYNCGEN1: input = 1; break;
case DISP_DEVICE_RESCONV : input = 2; break;
default:
return -EINVAL;
}
NX_MIPI_DSI_SetPLL(index
,CTRUE // CBOOL Enable ,
,0xFFFFFFFF // U32 PLLStableTimer,
,PLLPMS_80MHz // 19'h033E8: 1Ghz // Use LN28LPP_MipiDphyCore1p5Gbps_Supplement.
,BANDCTL_80MHz // 4'hF : 1Ghz // Use LN28LPP_MipiDphyCore1p5Gbps_Supplement.