rockchip 平台 LCD dtsi 格式转化工具


在rk平台调试时候,经常遇到 LCD 厂商提供的参数格式不是我们需要的格式,这时候需要转换格式需要额外多做很多工作,如下格式为常见格式:

  1. Resolution:800x1280
  2. External system porch setting: VS=4 ,VBP=8 ,VFP=24 ,HS=18 ,HBP=18 ,HFP=18
  3. Frame rate:60HZ
  4. MIPI CLK:405Mbps
  5. Power:VCI=3.3, IOVCC=1.8
  6. LCD_nReset=1;
  7. Delayms(5);
  8. LCD_nReset=0;
  9. Delayms(10);
  10. LCD_nReset=1;
  11. Delayms(120);
  12. //========== JD9365 B0E10.1 initial setting ==========//
  13. //Page0
  14. SSD_Single(0xE0,0x00);
  15. //--- PASSWORD  ----//
  16. SSD_Single(0xE1,0x93);
  17. SSD_Single(0xE2,0x65);
  18. SSD_Single(0xE3,0xF8);
  19. //Lane select by internal reg  4 lanes
  20. SSD_Single(0xE0,0x04);
  21. SSD_Single(0x2D,0x03);//defult 0x01
  22. SSD_Single(0xE0,0x00);
  23. SSD_Single(0x80,0x03);
  24. //--- Sequence Ctrl  ----//
  25. SSD_Single(0x70,0x02);  //DC0,DC1
  26. SSD_Single(0x71,0x23);  //DC2,DC3
  27. SSD_Single(0x72,0x06);  //DC7
  28. ... // 省略部分代码
  29. //DISP ON
  30. SSD_Number(0x01);
  31. SSD_CMD(0x29);      // DSPON
  32. Delayms(5);
  33. //--- TE----//
  34. SSD_Single(0x35,0x00);

几百行转化成rk认可的格式如下:

  1. /*
  2.  * Copyright (C) 2018 xxxx, Inc.
  3.  * Licensed under GPLv2 or later.
  4.  * fileName     : lcd-JLT_BI10119P40-28D_JD9365-mipi.dtsi
  5.  * author       : W.Honee
  6.  * create date  : Thu Jan  4 10:44:06 2018
  7.  * lcd model    : JLT_BI10119P40-28D
  8.  * resolution   : 800 X 1280
  9.  * mipi channel : four
  10.  */
  11. / {
  12.     /* mipi 相关配置 
  13.      * compatible            -- 用户内核代码寻找对应dts配置的匹配字符串
  14.      * rockchip,screen_init  -- 配置是否需要初始化代码,为1时,disp_mipi_init_cmds 才有效果
  15.      * rockchip,dsi_lane     -- 配置MIPI的通道数
  16.      * rockchip,dsi_hs_clk   -- MIPI时钟
  17.      * rockchip,mipi_dsi_num -- 配置MIPI的组数
  18.      */
  19.     disp_mipi_init: mipi_dsi_init{
  20.         compatible = "rockchip,mipi_dsi_init";
  21.         rockchip,screen_init    = <1>;
  22.         rockchip,dsi_lane       = <4>;
  23.         rockchip,dsi_hs_clk     = <500>;
  24.         rockchip,mipi_dsi_num   = <1>;
  25.     };
  26.     /* mipi lcd 的电源配置( 说明:默认不需要开启脚位控制 )
  27.      * compatible            -- 用户内核代码寻找对应dts配置的匹配字符串
  28.      * mipi_lcd_rst          -- 配置复位脚
  29.      * mipi_lcd_en           -- 配置电源脚
  30.      */
  31.     disp_mipi_power_ctr: mipi_power_ctr {
  32.         compatible = "rockchip,mipi_power_ctr";
  33.         /*
  34.         mipi_lcd_rst:mipi_lcd_rst{
  35.                 compatible = "rockchip,lcd_rst";
  36.                 rockchip,gpios = <&gpio2 GPIO_C2 GPIO_ACTIVE_HIGH>;
  37.                 rockchip,delay = <20>;
  38.         };               
  39.         mipi_lcd_en:mipi_lcd_en {
  40.                 compatible = "rockchip,lcd_en";
  41.                 rockchip,gpios = <&gpio0 GPIO_C1 GPIO_ACTIVE_HIGH>;
  42.                 rockchip,delay = <100>;
  43.         };  
  44.         */
  45.     };
  46.     /* mipi lcd 初始化代码
  47.      * compatible            -- 用户内核代码寻找对应dts配置的匹配字符串
  48.      * rockchip,cmd_debug    -- 配置是否启用debug模式
  49.      * str_init_cmds         -- 配置具体初始化值
  50.      */
  51.     disp_mipi_init_cmds: screen-on-cmds {
  52.         compatible = "rockchip,screen-on-cmds";
  53.         rockchip,cmd_debug = <0>;
  54.         rockchip,on-cmds1{
  55.             compatible = "rockchip,on-cmds";
  56.             rockchip,cmd_type = ;
  57.             rockchip,dsi_id = <0>;
  58.             rockchip,cmd = <0x15 0xE0 0x00>;
  59.             rockchip,cmd_delay = <1>;
  60.         };
  61.         rockchip,on-cmds2{
  62.             compatible = "rockchip,on-cmds";
  63.             rockchip,cmd_type = ;
  64.             rockchip,dsi_id = <0>;
  65.             rockchip,cmd = <0x15 0xE1 0x93>;
  66.             rockchip,cmd_delay = <1>;
  67.         };
  68.        ... // 省略部分代码
  69.         rockchip,on-cmds221{
  70.             compatible = "rockchip,on-cmds";
  71.             rockchip,cmd_type = ;
  72.             rockchip,dsi_id = <0>;
  73.             rockchip,cmd = <0x15 0x35 0x00>;
  74.             rockchip,cmd_delay = <1>;
  75.         };
  76.     };
  77.     /* 
  78.      * mipi lcd 时序配置,此部分需要手动修改细节。
  79.      *
  80.      */
  81.     disp_timings: display-timings {
  82.         native-mode = <&timing0>;
  83.         compatible = "rockchip,display-timings";
  84.         timing0: timing0 {
  85.             screen-type = ;
  86.             lvds-format = ;
  87.             out-face    = ;
  88.             clock-frequency = <72000000>;
  89.             hactive = <800>;
  90.             vactive = <1280>;
  91.             hback-porch = <18>; // 120
  92.             hfront-porch = <18>;
  93.             vback-porch = <8>;  // 14
  94.             vfront-porch = <24>; // 116
  95.             hsync-len = <18>;
  96.             vsync-len = <4>;
  97.             hsync-active = <0>;
  98.             vsync-active = <0>;
  99.             de-active = <0>;
  100.             pixelclk-active = <0>;
  101.             swap-rb = <0>;
  102.             swap-rg = <0>;
  103.             swap-gb = <0>;
  104.         };
  105.     };
  106. };

手动修改劳神费力,所以我觉得应该写一个工具在提高效率,于是就有了如下代码:

  1. #!/usr/bin/python
  2. #-*- coding: utf-8 -*-
  3. '''
  4. NAME   : 转化屏初始化代码为Rockchip芯片的dts格式
  5. AUTOR  : W.Honee
  6. DATE   : 20180102
  7. VERSION: V0.1
  8. '''
  9. import re
  10. import os
  11. import sys
  12. import time
  13. import getpass
  14. """
  15.     常量数据
  16. """
  17. DEFAULT_MIPI_CLK = 500
  18. DEFAULT_CMD_DELAY = 0
  19. DEFAULT_RESUME_DELAY = 120
  20. DEFAULT_EXIT_DELAY = 90
  21. '''
  22.     常量字符串定义
  23. '''
  24. FILE_HEAD = """
  25. /*
  26.  * Copyright (C) 2018 xxxx, Inc.
  27.  * Licensed under GPLv2 or later.
  28.  * fileName     : %str_fileName%
  29.  * author       : %str_author%
  30.  * create date  : %str_date%
  31.  * lcd model    : 请手动填入Model型号
  32.  * resolution   : 请手动填入分辨率
  33.  * mipi channel : 请手动填入mipi通道数
  34.  */
  35. """
  36. FILE_BODY_HEAD = """
  37. / {
  38.     /* mipi 相关配置 
  39.      * compatible            -- 用户内核代码寻找对应dts配置的匹配字符串
  40.      * rockchip,screen_init  -- 配置是否需要初始化代码,为1时,disp_mipi_init_cmds 才有效果
  41.      * rockchip,dsi_lane     -- 配置MIPI的通道数
  42.      * rockchip,dsi_hs_clk   -- MIPI时钟
  43.      * rockchip,mipi_dsi_num -- 配置MIPI的组数
  44.      */
  45.     disp_mipi_init: mipi_dsi_init{
  46.         compatible = "rockchip,mipi_dsi_init";
  47.         rockchip,screen_init    = <1>;
  48.         rockchip,dsi_lane       = <4>;
  49.         rockchip,dsi_hs_clk     = <%str_hs_clk%>;
  50.         rockchip,mipi_dsi_num   = <1>;
  51.     };
  52.     /* mipi lcd 的电源配置( 说明:默认不需要开启脚位控制 )
  53.      * compatible            -- 用户内核代码寻找对应dts配置的匹配字符串
  54.      * mipi_lcd_rst          -- 配置复位脚
  55.      * mipi_lcd_en           -- 配置电源脚
  56.      */
  57.     
  58.     disp_mipi_power_ctr: mipi_power_ctr {
  59.         compatible = "rockchip,mipi_power_ctr";
  60.         /*
  61.         mipi_lcd_rst:mipi_lcd_rst{
  62.                 compatible = "rockchip,lcd_rst";
  63.                 rockchip,gpios = <&gpio2 GPIO_C2 GPIO_ACTIVE_HIGH>;
  64.                 rockchip,delay = <20>;
  65.         };               
  66.         mipi_lcd_en:mipi_lcd_en {
  67.                 compatible = "rockchip,lcd_en";
  68.                 rockchip,gpios = <&gpio0 GPIO_C1 GPIO_ACTIVE_HIGH>;
  69.                 rockchip,delay = <100>;
  70.         };  
  71.         */
  72.     
  73.     };
  74.     
  75.     /* mipi lcd 初始化代码
  76.      * compatible            -- 用户内核代码寻找对应dts配置的匹配字符串
  77.      * rockchip,cmd_debug    -- 配置是否启用debug模式
  78.      * str_init_cmds         -- 配置具体初始化值
  79.      */
  80.      
  81.     disp_mipi_init_cmds: screen-on-cmds {        
  82.         compatible = "rockchip,screen-on-cmds";
  83.         rockchip,cmd_debug = <0>;
  84. """
  85. ROCKCHIP_INIT_CMD = """
  86.         rockchip,on-cmds%str_count%{
  87.             compatible = "rockchip,on-cmds";
  88.             rockchip,cmd_type = ;
  89.             rockchip,dsi_id = <0>;
  90.             rockchip,cmd = <%str_cmds%>;
  91.             rockchip,cmd_delay = <%str_delay%>;
  92.         };
  93. """
  94. FILE_BODY_TAIL = """
  95.     
  96.     };
  97.     
  98.     /* 
  99.      * mipi lcd 时序配置,此部分需要手动修改细节。
  100.      *
  101.      */
  102.      
  103.     disp_timings: display-timings {
  104.         native-mode = <&timing0>;
  105.         compatible = "rockchip,display-timings";
  106.         timing0: timing0 {
  107.             screen-type = ;
  108.             lvds-format = ;
  109.             out-face    = ;
  110.             clock-frequency = <72000000>;
  111.             hactive = <800>;
  112.             vactive = <1280>;
  113.             hback-porch = <18>; // 120
  114.             hfront-porch = <18>;
  115.             vback-porch = <8>;  // 14
  116.             vfront-porch = <24>; // 116
  117.             hsync-len = <18>;
  118.             vsync-len = <4>;
  119.             hsync-active = <0>;
  120.             vsync-active = <0>;
  121.             de-active = <0>;
  122.             pixelclk-active = <0>;
  123.             swap-rb = <0>;
  124.             swap-rg = <0>;
  125.             swap-gb = <0>;
  126.         };
  127.     
  128.     };
  129. };
  130. """
  131. BASEDIR = os.path.abspath(os.path.dirname(__file__))
  132. '''
  133.     定义各种函数
  134. '''
  135. def parse_init_files():
  136.     '''
  137.         解析并写入文件
  138.     '''
  139.     fileHead = re.sub('%str_fileName%',sys.argv[1].split('.')[0]+'.dtsi',FILE_HEAD)
  140.     fileHead = re.sub('%str_author%',getpass.getuser(),fileHead)
  141.     fileHead = re.sub('%str_date%',time.asctime( time.localtime(time.time()) ),fileHead)
  142.     fileHead = re.sub('%str_model_name%',"",fileHead)
  143.     with open(sys.argv[1].split('.')[0]+'.dtsi', 'w') as f:
  144.         f.write(fileHead)
  145.     f.close()
  146.     count=0
  147.     with open(sys.argv[1], 'rb') as fi:
  148.         with open(sys.argv[1].split('.')[0]+'.dtsi', 'aw') as fo:
  149.             fo.write(re.sub('%str_hs_clk%',str(DEFAULT_MIPI_CLK),FILE_BODY_HEAD))
  150.             for line in fi:
  151.                 if line.startswith("//"):
  152.                     #print " -- 注释行直接保留 -- " + ENTER
  153.                     #fo.write(line)
  154.                     continue
  155.                 elif line.startswith('SSD_Single'):
  156.                     count = count + 1
  157.                     params = line[11:].split(';')[0].split(')')[0].split(',')
  158.                     data = re.sub('%str_count%',str(count),ROCKCHIP_INIT_CMD)
  159.                     # 0x15 2段的数据
  160.                     if len(params) == 2:
  161.                         temp = "0x15 " + params[0] + " " + params[1]
  162.                     # 0x39 多段的数据
  163.                     elif len(params) > 2:
  164.                         temp = '0x39'
  165.                         for param in params:
  166.                             temp = temp + " " + param
  167.                     data = re.sub('%str_cmds%',temp,data)
  168.                     data = re.sub('%str_delay%',str(DEFAULT_CMD_DELAY),data)
  169.                     fo.write(data)
  170.                 elif line.startswith('SSD_CMD'):
  171.                     count = count + 1
  172.                     params = line[8:12]
  173.                     data = re.sub('%str_count%',str(count),ROCKCHIP_INIT_CMD)
  174.                     if params == '0x11':
  175.                         temp = "0x05 dcs_set_display_on"
  176.                         data = re.sub('%str_cmds%',temp,data)
  177.                         data = re.sub('%str_delay%',str(DEFAULT_RESUME_DELAY),data)
  178.                     elif params == '0x29':
  179.                         temp = "0x05 dcs_exit_sleep_mode"
  180.                         data = re.sub('%str_cmds%',temp,data)
  181.                         data = re.sub('%str_delay%',str(DEFAULT_EXIT_DELAY),data)
  182.                     fo.write(data)
  183.                 else:
  184.                     continue
  185.                     #print "---不需要处理,舍弃的数据----" + ENTER
  186.                     #print line
  187.             fo.write(FILE_BODY_TAIL)
  188.     fo.close()
  189.     fi.close()
  190. def main( ):
  191.     '''
  192.         入口函数
  193.     '''
  194.     parse_init_files( )
  195. if __name__ == '__main__':
  196.     ''' 工具被调用的,入口按照main函数 '''
  197.     if len(sys.argv) < 2:
  198.         print "输出参数错误,请输入有效的文件名!"
  199.         sys.exit()
  200.     elif len(sys.argv) == 2:
  201.         if not os.path.isfile(sys.argv[1]):
  202.             print "原始驱动文件不存在,请确认文件名是否输入错误!"
  203.             sys.exit()
  204.         print "开始转换格式,请稍后 ..."
  205.     main( )
  206.     print '文件转换完毕!'
  207.     exit( )

输入需要转化的LCD的原始文件,就可以输出我们需要的rk格式的代码。
当然其他格式的如 Generic_Short_Write_1P 和 DCS_Short_Write_1P 等都可以如法炮制。

版权所有丨如未注明,均为原创,转载请注明转自:https://whonee.net/rockchip-lcd-format-tools.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注