FC11290G在MT8167的调试
2赞液晶驱动IC:FC11290
LCD:略
接口:MIPI-4LANE
Power mode:3power
问题点1:开机显示异常,见下图,中间发黑,四周亮,从经验来看,应该是GIP不对导致,所以需要从代码方面去分析问题。先是用万用表量各输入电压是否正常供电,此处有IOVCC,VSN,VSP,经测量,各路电压供电正常。
由于第一次调这款IC,还没有拿到IC规格书,手上只有初始化代码,本来想试试BIST MODE,先排除porch不对导致的显异,既然没有IC资料,那BIST MODE就不试了。
接下来我们看看初始化代码,如下为完整的初始化代码,个别寄存器的参数比较多(注意*),如E9h,EAh。
第一步,先让方案把LCD.C发我核对,看是否为移植出错,经对比发现平台下的代码跟测试架下发的代码一致。
{0x11, 0, {}},
{REGFLAG_DELAY, 120, {} },
{0xB9,3,{0xF1,0x12,0x90}},
{0xBA,27,{0x33,0x81,0x15,0xF9,0x0E,0x0E,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x25,0x00,0x91,0x0A,0x00,0x00,0x00,0x4F,0x01,0x00,0x00,0x37}},
{0xB2,3,{0x40,0x0A,0x30}},
{0xB3,10,{0x28,0x28,0x28,0x28,0x03,0xFF,0x00,0x00,0x00,0x00}},
{0xB4,1,{0x80}},
{0xB5,3,{0x09,0x09,0xF0}},
{0xB6,2,{0xb8,0xb8}},
{0xB8,2,{0x76,0x22}},
{0xBC,1,{0x46}},
{0xBF,3,{0x02,0x11,0x00}},
{0xC0,9,{0x73,0x73,0x50,0x50,0x00,0x00,0x08,0x70,0x00}},
{0xC1,12,{0x53,0x00,0x32,0x32,0x77,0xc1,0xCC,0xDD,0xAA,0xAA,0x77,0x77}},
{0xCC,1,{0x0B}},
{0xE3,14,{0x07,0x07,0x0B,0x0B,0x03,0x0B,0x00,0x00,0x00,0x00,0xFF,0x80,0xC0,0x10}},
{0xE9,63,{0x02,0x00,0x00,0x00,0x00,0x41,0x88,0x12,0x31,0x23,0x38,0x04,0x61,0x88,0x37,0x0A,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x31,0x57,0x88,0x88,0x88,0x18,0x8F,0x38,0x88,0xF8,0x88,0x20,0x46,0x88,0x88,0x88,0x08,0x8F,0x28,0x88,0xF8,0x88,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
{0xEA,63,{0x00,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x20,0x88,0x88,0x88,0x2F,0x88,0x08,0x88,0xF8,0x88,0x57,0x31,0x88,0x88,0x88,0x3F,0x88,0x18,0x88,0xF8,0x88,0x23,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0B}},
{0xE0,34,{0x00,0x12,0x18,0x3F,0x3F,0x3F,0x4C,0x48,0x07,0x0D,0x0D,0x10,0x10,0x11,0x13,0x10,0x1E,0x00,0x12,0x18,0x3F,0x3F,0x3F,0x4C,0x48,0x07,0x0D,0x0D,0x10,0x10,0x11,0x13,0x10,0x1E}},
{0xC6,8,{0x00,0x0C,0xFF,0xFF,0x00,0xFF,0x60,0x28}},
{0x29, 0, {}},
{REGFLAG_DELAY, 50, {} },
{REGFLAG_END_OF_TABLE, 0x00, {}},
};
第二步,看看主板下发的代码是否正确,是否存在漏发,错发,多发,这种问题在调屏过程中遇到过很多次,要时刻提醒自己,紧接着飞线(D0N,D0P,GND),用随身携带的逻辑分析仪(TL2236B)抓取主板下的代码,如下图所示。
很明显,主板在发送初始化出现错误,E9,EA对应GIP,E0是设置gamma的。那问题来了,为什么MTK平台会发送错误?我们很少遇到发送错误的,其实屏厂的工程师有时在测试架上也会遇到,市场上常见的MIPI测试架都是用的SSD2828QN4,当打包个数(length)与实际下发的参数不一致时,也会导致整个数据包出错,从而导致这个寄存器配置不成功。
由此可见分析问题的方向是对的,接下来要做的就是找到MIPI打包出错的原因。前面我们提到个别寄存器的长度太长,上述代码中像E9h,EAh,参数有63个加上寄存器本身都64个字节了,我们常见的ic寄存器参数都比较短,像FITI,ILITEK,Novatek,Gohi,Focaltech,himax的参数都不会太长,以前见过三星的IC(S6D7AT0B01)有的寄存器参数比较长,有100多个。
从以往的经验来看,有些IC在MTK平台要用其它的写法,如data_array这种写法,这种写法直接将datatype都体现出来,如{0xB9,3,{0xF1,0x12,0x90}},对应的data_array写法如下:
data_array[0]=0x00043902;
data_array[1]=0x9012F1B9;
dsi_set_cmdq(data_array,2, 1);
手工转换太慢,于是找群里的大佬要了一个小工具,分分钟搞定格式转换。
data_array[0]=0x00043902;
data_array[1]=0x9012F1B9;
dsi_set_cmdq(data_array,2, 1);
data_array[0]=0x001C3902;
data_array[1]=0x158133BA;
data_array[2]=0x020E0EF9;
data_array[3]=0x00000000;
data_array[4]=0x44000000;
data_array[5]=0x0A910025;
data_array[6]=0x4F000000;
data_array[7]=0x37000001;
dsi_set_cmdq(data_array,8, 1);
data_array[0]=0x00043902;
data_array[1]=0x300A40B2;
dsi_set_cmdq(data_array,2, 1);
data_array[0]=0x000B3902;
data_array[1]=0x282828B3;
data_array[2]=0x00FF0328;
data_array[3]=0x00000000;
dsi_set_cmdq(data_array,4, 1);
data_array[0]=0x80B41500;
dsi_set_cmdq(data_array,1, 1);
data_array[0]=0x00043902;
data_array[1]=0xF00909B5;
dsi_set_cmdq(data_array,2, 1);
data_array[0]=0x00033902;
data_array[1]=0x00BBBBB6;
dsi_set_cmdq(data_array,2, 1);
data_array[0]=0x00033902;
data_array[1]=0x002276B8;
dsi_set_cmdq(data_array,2, 1);
data_array[0]=0x46BC1500;
dsi_set_cmdq(data_array,1, 1);
data_array[0]=0x00043902;
data_array[1]=0x001102BF;
dsi_set_cmdq(data_array,2, 1);
data_array[0]=0x000A3902;
data_array[1]=0x507373C0;
data_array[2]=0x08000050;
data_array[3]=0x00000070;
dsi_set_cmdq(data_array,4, 1);
data_array[0]=0x000D3902;
data_array[1]=0x320053C1;
data_array[2]=0xCCC17732;
data_array[3]=0x77AAAADD;
data_array[4]=0x00000077;
dsi_set_cmdq(data_array,5, 1);
data_array[0]=0x0BCC1500;
dsi_set_cmdq(data_array,1, 1);
data_array[0]=0x000F3902;
data_array[1]=0x0B0707E3;
data_array[2]=0x000B030B;
data_array[3]=0xFF000000;
data_array[4]=0x0010C080;
dsi_set_cmdq(data_array,5, 1);
data_array[0]=0x00403902;
data_array[1]=0x000002E9;
data_array[2]=0x88410000;
data_array[3]=0x38233112;
data_array[4]=0x37886104;
data_array[5]=0x0044000A;
data_array[6]=0x00000000;
data_array[7]=0x00000044;
data_array[8]=0x88573100;
data_array[9]=0x8F188888;
data_array[10]=0x88F88838;
data_array[11]=0x88884620;
data_array[12]=0x288F0888;
data_array[13]=0x0088F888;
data_array[14]=0x00010000;
data_array[15]=0x00000000;
data_array[16]=0x00000000;
dsi_set_cmdq(data_array,17, 1);
data_array[0]=0x00403902;
data_array[1]=0x001A00EA;
data_array[2]=0x00000000;
data_array[3]=0x00000000;
data_array[4]=0x88204600;
data_array[5]=0x882F8888;
data_array[6]=0x88F88808;
data_array[7]=0x88883157;
data_array[8]=0x18883F88;
data_array[9]=0x2388F888;
data_array[10]=0x00000010;
data_array[11]=0x00000010;
data_array[12]=0x00000000;
data_array[13]=0x00000000;
data_array[14]=0x00000000;
data_array[15]=0x00000000;
data_array[16]=0x0B010000;
dsi_set_cmdq(data_array,17, 1);
data_array[0]=0x00233902;
data_array[1]=0x181200E0;
data_array[2]=0x4C3F3F3F;
data_array[3]=0x0D0D0748;
data_array[4]=0x13111010;
data_array[5]=0x12001E10;
data_array[6]=0x3F3F3F18;
data_array[7]=0x0D07484C;
data_array[8]=0x1110100D;
data_array[9]=0x001E1013;
dsi_set_cmdq(data_array,10, 1);
data_array[0]=0x00093902;
data_array[1]=0xFF0C00C6;
data_array[2]=0x60FF00FF;
data_array[3]=0x00000028;
dsi_set_cmdq(data_array,4, 1);
代码发给驱动并编译软件验证,结果还是一样的现象,用逻辑分析仪抓取发现仍然发错,由此可以说明代码错发跟格式没关系,需要从其它地方找原因。当天建议方案提FAQ给MTK原厂。
第二天收到方案公司的回复说初始化已经送成功,屏已经正常点亮,他们说改了如下地方,至于下面的代码会影响什么,就不清楚了,属于我的知识盲区,或许是设置了打包长度
默认的mipi打包长度应该是64byte(para_list[64])以内,见下面结构体,反正记住这点吧,既然理解不了那就记死的。
struct LCM_setting_table {
unsigned char cmd;
unsigned char count;
unsigned char para_list[64];
};
终上所述,开机显异的问题解决。
半个月后,方案又反馈问题,说唤醒显示异常,此处说明一下,第一次送的样品唤醒正常,试产的屏唤醒异常,有可能是IC厂改了东西,但不对外透露,我用测试架回读两个屏的默认值发现有差异,下图为寄存器对比图。
不良现象如下图,显示异常。
还是老方法,直接抓主板下的代码,发现有发2A,2B寄存器,用测试架将2A,2B加上去,未见2A,2B干扰FC11290G,以前在波导时遇到过,ILI9881B+GP3.97吃2A,2B寄存器。现在大部分FW以上分辨率的IC都不带RAM,担心会吃这些寄存器。
问IC原厂的朋友,他说可能是复位不对导致的,个别寄存器复位不成功,导致写不成功,此时用万用表量唤醒时的各路电压发现IOVCC=2.8V。
普及一个小常识,MTK平台开机调用的是LK,唤醒调用kernel,容易记混淆。
当前软件开机时IOVCC=1.8V,显示正常,但是kernel唤醒后IOVCC变成2.8V了,IOVCC是逻辑电平,RESET的高电平需要跟IOVCC保持一致,唤醒时RESET的高电平还是1.8V,1.8V高电平复位不一定会成功,电平不兼容导致复位不完全,导致主板给FC11290写初始化不成功,从而导致唤醒后的画面异常。
滴滴FAE小提示:分析问题时,先排除硬件没问题再找软件的问题,以上问题完美解决,希望对你有用。