英伟达 TX2 MIPI LCD 初始化代码转化

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英寸触摸屏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值