MIPI 接口的LCD 初始化代码 同样有下面4种
/* Long Packet: <PACKETTYPE[u8] COMMANDID[u8] PAYLOADCOUNT[u16] ECC[u8] PAYLOAD[..] CHECKSUM[u16]> */
/* Short Packet: <PACKETTYPE[u8] COMMANDID[u8] DATA0[u8] DATA1[u8] ECC[u8]> */
/* delay <DELAYMS data> */
short Packet 又分为 无参和只带一个参数
PACKETTYPE COMMANDID DELAYMS 可参考TX2 内核源码 dc.h
TX2 PACKETTYPE 为 TEGRA_DSI_PACKET_CMD
TX2 Long Packet COMMANDID 为 DSI_DCS_LONG_WRITE
TX2 Short Packet COMMANDID 无参 为 DSI_DCS_WRITE_0_PARAM
TX2 Short Packet COMMANDID 带一个参数 为 DSI_DCS_WRITE_1_PARAM
TX2 DELAY 为 TEGRA_DSI_DELAY_MS
以下例子是LCD厂家给出的 主控IC 为XM91080 5.5寸 1080*1920 MIPI LCD 初始化代码
//==== Initial Code Start =======
void initi(void)
{
res=1;
delay(1); // delay 1ms
res=0;
delay(10);// delay 10ms
res=1;
delay(120);// delay 120ms
//********************************
// Set XM Command Password 1
//W_COM(0x00,0x11,0x01,0x02,0x03);
W_COM(0x00,0x00);
W_COM(0xFF,0x10,0x80,0x01);
//Set XM Command Password 2
W_COM(0x00,0x80);
W_COM(0xFF,0x10,0x80);
//boe 5.5
//tcon setting ok
W_COM(0x00,0x81);
W_COM(0xb2,0x74);
W_COM(0x00,0x86);
//W_COM(0xb2,0x01,0x01,0x01,0x01,0x22,0x02);
W_COM(0xb2,0x01,0x01,0x01,0x01,0x1B,0x08); //20190905
//ckv setting
W_COM(0x00,0x80);
W_COM(0xb4,0x18,0x03,0x07,0x80,0x02,0x00,0x00,0x02,0x00,0x00);
W_COM(0x00,0x90);
W_COM(0xb4,0x18,0x02,0x07,0x82,0x02,0x00,0x00,0x02,0x00,0x00);
W_COM(0x00,0xa0);
W_COM(0xb4,0x18,0x01,0x07,0x82,0x02,0x00,0x00,0x02,0x00,0x00);
W_COM(0x00,0xb0);
W_COM(0xb4,0x18,0x00,0x07,0x83,0x02,0x00,0x00,0x02,0x00,0x00);
//vst
W_COM(0x00,0x80);
W_COM(0xb6,0x83,0x02,0x00,0x60,0x82,0x02,0x00,0x60);
//u2d ok
W_COM(0x00,0x80);
W_COM(0xbc,0x00,0x0e,0x25,0x26,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x21,0x20,0x1f);
W_COM(0x00,0x90);
W_COM(0xbc,0x00,0x0d,0x25,0x26,0x00,0x05,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x21,0x20,0x1f);
//d2u ok
W_COM(0x00,0xa0);
W_COM(0xbc,0x00,0x0d,0x26,0x25,0x00,0x07,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x21,0x20,0x1f);
W_COM(0x00,0xb0);
W_COM(0xbc,0x00,0x0e,0x26,0x25,0x00,0x08,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x21,0x20,0x1f);
//enmode
W_COM(0x00,0xa0);
W_COM(0xb9,0xff,0xd4,0xd7,0xd7,0xff,0xd4,0xe0,0xd4,0xff,0xff,0xff,0xff,0xff,0xe4,0xe4,0xe4);
W_COM(0x00,0xb0);
W_COM(0xb9,0xff,0xd4,0xd7,0xd7,0xff,0xd4,0xe0,0xd4,0xff,0xff,0xff,0xff,0xff,0xe4,0xe4,0xe4);
W_COM(0x00,0x80);
W_COM(0xb9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
W_COM(0x00,0x90);
W_COM(0xb9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
//gip lvd
W_COM(0x00,0x80);
W_COM(0xba,0xea,0xea,0xff,0xc0,0xea,0xea,0xff,0xc0);
//gip hiz
//gip ultra setting
W_COM(0x00,0xd0);
W_COM(0xb6,0x81,0x00,0x02,0x02);
W_COM(0x00,0xe0);
W_COM(0xb6,0x00,0x0c,0x22,0x02,0x20,0x11,0x01,0x01,0x04,0x00);
// G-swap
W_COM(0x00,0xA5);
W_COM(0xC0,0x20);
// mirror X2
W_COM(0x00,0xA0);
W_COM(0xA5,0x20); //20-0正刷,10-倒刷
// VGH=VGHO/VGL=VGLO
W_COM(0x00,0xF0);
W_COM(0xA4,0x00);
// VGL/VGH = -8 / 9
W_COM(0x00,0x90);
W_COM(0xAB,0xA8,0x9E);
//VCOM
W_COM(0x00,0xB1);
W_COM(0xA4,0xB8,0xB8); //-0.2
// GVDDP/GVDDN
W_COM(0x00,0xA0);
W_COM(0xA4,0x23,0x23); //4.6
W_COM(0x00,0x80); //
W_COM(0xD4,0x03,0x05,0x07,0x0C,0x12,0x16,0x19,0x1F,0x23,0x32,0x3C,0x4D,0x59,0x6D,0x7C,0x7C,0x8C,0x9E,0xAB,0xBB,0xC6,0xD4,0xD8,0xDD,0xE2,0xE7,0xEC,0xF3,0xFB,0xFF,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00);
W_COM(0x00,0x80);
W_COM(0xD5,0x03,0x05,0x07,0x0C,0x12,0x16,0x19,0x1F,0x23,0x32,0x3C,0x4D,0x59,0x6D,0x7C,0x7C,0x8C,0x9E,0xAB,0xBB,0xC6,0xD4,0xD8,0xDD,0xE2,0xE7,0xEC,0xF3,0xFB,0xFF,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00);
W_COM(0x00,0x80);
W_COM(0xD6,0x03,0x05,0x07,0x0C,0x12,0x16,0x19,0x1F,0x23,0x32,0x3C,0x4D,0x59,0x6D,0x7C,0x7C,0x8C,0x9E,0xAB,0xBB,0xC6,0xD4,0xD8,0xDD,0xE2,0xE7,0xEC,0xF3,0xFB,0xFF,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00);
W_COM(0x00,0x80);
W_COM(0xD7,0x03,0x05,0x07,0x0C,0x12,0x16,0x19,0x1F,0x23,0x32,0x3C,0x4D,0x59,0x6D,0x7C,0x7C,0x8C,0x9E,0xAB,0xBB,0xC6,0xD4,0xD8,0xDD,0xE2,0xE7,0xEC,0xF3,0xFB,0xFF,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00);
W_COM(0x00,0x80);
W_COM(0xD8,0x03,0x05,0x07,0x0C,0x12,0x16,0x19,0x1F,0x23,0x32,0x3C,0x4D,0x59,0x6D,0x7C,0x7C,0x8C,0x9E,0xAB,0xBB,0xC6,0xD4,0xD8,0xDD,0xE2,0xE7,0xEC,0xF3,0xFB,0xFF,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00);
W_COM(0x00,0x80);
W_COM(0xD9,0x03,0x05,0x07,0x0C,0x12,0x16,0x19,0x1F,0x23,0x32,0x3C,0x4D,0x59,0x6D,0x7C,0x7C,0x8C,0x9E,0xAB,0xBB,0xC6,0xD4,0xD8,0xDD,0xE2,0xE7,0xEC,0xF3,0xFB,0xFF,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00);
// enmode_sdpch
W_COM(0x00,0xC2);
W_COM(0xA6,0x08);
// sd_prc
W_COM(0x00,0x86);
W_COM(0xA5,0x19);
W_COM(0x00,0x83);
W_COM(0xA7,0x88); //0x88=1.325;
// mipi skew
W_COM(0x00,0x90);
W_COM(0xA3,0x04,0x04,0x01,0x05,0x06,0x00);
W_COM(0x00,0xC0);
W_COM(0xA4,0x01); //20190905
//==== Initial Code END =======
W_COM_DCS(0x11);
Delayms(200);
W_COM_DCS(0x29);
Delayms(20);
}
void LCD_Exit_Standby (void)
{
initi();//从新下一次初始化
}
编写python 程序 解析这段初始化代码,并生成TX2 能识别的初始化code
def getCommandStr(filename):
with open(filename,'r') as f:
Packettype= 'TEGRA_DSI_PACKET_CMD'
CommandIdWithOneparam = 'DSI_DCS_WRITE_1_PARAM'
CommandIdNoparam = 'DSI_DCS_WRITE_0_PARAM'
CommandIdLongWrite = 'DSI_DCS_LONG_WRITE'
CommandDelay = 'TEGRA_DSI_DELAY_MS'
for line in f:
strnew = line.strip()
#去除屏蔽的字段
if strnew.startswith('//'):
continue
indexFoundWCOM = line.find('W_COM(')
indexFoundWCOMDCS = line.find('W_COM_DCS(')
indexFoundDelayms = line.find('Delayms(')
indexFoundRightkuohao = line.find(')')
if indexFoundWCOM >= 0 and indexFoundRightkuohao >= len('W_COM('):
startindex = indexFoundWCOM + len('W_COM(')
substr = line[startindex: indexFoundRightkuohao]
hexitems = substr.split(',')
if len(hexitems) == 2: #DSI_DCS_WRITE_1_PARAM
# Short Packet: <PACKETTYPE[u8] COMMANDID[u8] DATA0[u8] DATA1[u8] ECC[u8]>
cmditemstr = []
cmditemstr.append(Packettype)
cmditemstr.append(CommandIdWithOneparam)
cmditemstr.extend(hexitems)
cmditemstr.append('0x00') #ECC[u8]
commandstr = '<' + ' '.join(cmditemstr) + '>'
yield commandstr
elif len(hexitems) >= 3:
cmditemstr = []
lenHigh = len(hexitems) >> 8
lenLow = len(hexitems) & 0x00FF
lenHighstr = '0x%02x' % lenHigh
lenLowstr = '0x%02x' % lenLow
cmditemstr.append(Packettype)
cmditemstr.append(CommandIdLongWrite)
cmditemstr.append(lenLowstr)
cmditemstr.append(lenHighstr)
cmditemstr.append('0x00') # ECC[u8]
cmditemstr.extend(hexitems)
cmditemstr.append('0x00') # ECC[u16]
cmditemstr.append('0x00')
commandstr= '<' + ' '.join(cmditemstr) + '>'
yield commandstr
elif indexFoundWCOMDCS >= 0 and indexFoundRightkuohao >= len('W_COM_DCS('):
# Short Packet: <PACKETTYPE[u8] COMMANDID[u8] DATA0[u8] DATA1[u8] ECC[u8]>
startindex = indexFoundWCOMDCS + len('W_COM_DCS(')
substr = line[startindex: indexFoundRightkuohao]
cmditemstr = []
cmditemstr.append(Packettype)
cmditemstr.append(CommandIdNoparam)
cmditemstr.append(substr)
cmditemstr.append('0x00')
cmditemstr.append('0x00') # ECC[u8]
commandstr = '<' + ' '.join(cmditemstr) + '>'
yield commandstr
elif indexFoundDelayms >= 0 and indexFoundRightkuohao >= len('Delayms('):
startindex = indexFoundDelayms + len('Delayms(')
substr = line[startindex: indexFoundRightkuohao]
cmditemstr = []
cmditemstr.append(CommandDelay)
cmditemstr.append(substr)
commandstr = '<' + ' '.join(cmditemstr) + '>'
yield commandstr
if __name__ == "__main__":
lcdInitCodeFile = 'XM91080G.txt'
with open('XM91080G_TX2.txt', 'w') as f:
for cmdstr in getCommandStr(lcdInitCodeFile):
f.write(cmdstr + ',' + '\n')
解析后的初始化代码 放入位置 参考我的博客 Jeston TX2设备树中增加DSI LCD设备,支持 RK3288 5.5英寸触摸屏