微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 大家谁有LG4572 MIPI的LCM驱动(最好MTK)

大家谁有LG4572 MIPI的LCM驱动(最好MTK)

时间:10-02 整理:3721RD 点击:
盲调好生蛋疼,求份能用的驱动,不胜感激

已经调试ok了

驱动能否贴出来,谢谢!


  1. #include <linux/string.h>

  2. #ifdef BUILD_UBOOT
  3. #include <asm/arch/mt6577_gpio.h>
  4. #else
  5. #include <mach/mt6577_gpio.h>
  6. #endif

  7. #include "lcm_drv.h"

  8. // ---------------------------------------------------------------------------
  9. //  Local Constants
  10. // ---------------------------------------------------------------------------

  11. #define FRAME_WIDTH  (480)
  12. #define FRAME_HEIGHT (800)

  13. // ---------------------------------------------------------------------------
  14. //  Local Variables
  15. // ---------------------------------------------------------------------------

  16. static LCM_UTIL_FUNCS lcm_util = {0};

  17. #define SET_RESET_PIN(v)    (lcm_util.set_reset_pin((v)))

  18. #define UDELAY(n) (lcm_util.udelay(n))
  19. #define MDELAY(n) (lcm_util.mdelay(n))


  20. // ---------------------------------------------------------------------------
  21. //  Local Functions
  22. // ---------------------------------------------------------------------------

  23. #define dsi_set_cmdq(pdata, queue_size, force_update)                lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
  24. #define wrtie_cmd(cmd)                                                                        lcm_util.dsi_write_cmd(cmd)
  25. #define write_regs(addr, pdata, byte_nums)                                lcm_util.dsi_write_regs(addr, pdata, byte_nums)
  26. #define read_reg                                                                                        lcm_util.dsi_read_reg()
  27.       

  28. #define LCM_DSI_CMD_MODE


  29. #define write_1byte(x)         data_array[0] = (x<<16) | 0x00000500;\
  30.                                                 dsi_set_cmdq(&data_array, 1, 1);\
  31.                                                 MDELAY(3);

  32. #define write_2byte(x1,x2)         data_array[0] = (x2<<24) |(x1<<16) |0x00001500;\
  33.                                                 dsi_set_cmdq(&data_array, 1, 1);\
  34.                                                 MDELAY(3);
  35. #define write_nbyte(n)      data_array[0] = (n<<16) | 0x00003902;
  36. #define get_4byte(x1,x2,x3,x4)  ((x4<<24) |(x3<<16) |(x2<<8) |(x1) )

  37. #if BUILD_UBOOT
  38. void mt65xx_disp_fill_rect(int left, int top,
  39.                            int right, int bottom,
  40.                            int color);
  41. #endif

  42. static void lcm_update(unsigned int x, unsigned int y,
  43.                        unsigned int width, unsigned int height);

  44. static void init_lcm_registers(void)
  45. {
  46.         unsigned int data_array[16];

  47.         write_1byte(0x20);
  48.         write_2byte(0x35,0x00);//01

  49.         write_nbyte(3);
  50.         data_array[1]=get_4byte(0x44,0x00,0x10,00);
  51.         dsi_set_cmdq(&data_array, 2, 1);
  52.         MDELAY(10);

  53.          write_2byte(0x36,0x00);
  54.           write_2byte(0x3a,0x77);
  55.         
  56.         write_nbyte(4);
  57.         data_array[1]=get_4byte(0xb1,0x06,0x43,0x0a);
  58.         dsi_set_cmdq(&data_array, 2, 1);
  59.         MDELAY(3);        

  60.         write_nbyte(3);
  61.         data_array[1]=get_4byte(0xb2,0x00,0xc8,00);
  62.         dsi_set_cmdq(&data_array, 2, 1);
  63.         MDELAY(10);

  64.           write_2byte(0xb3,0x00);
  65.   
  66.           write_2byte(0xb4,0x04);
  67.   
  68.          write_nbyte(6);
  69.         data_array[1]=get_4byte(0xb5,0x42,0x10,0x10);
  70.         data_array[2]=get_4byte(0x00,0x20,0x00,00);
  71.         dsi_set_cmdq(&data_array, 3, 1);
  72.         MDELAY(3);
  73.   
  74.           write_nbyte(7);
  75.         data_array[1]=get_4byte(0xb6,0x0b,0x0f,0x3c);
  76.         data_array[2]=get_4byte(0x13,0x13,0xe8,00);
  77.         dsi_set_cmdq(&data_array, 3, 1);
  78.         MDELAY(3);

  79.           write_nbyte(6);
  80.         data_array[1]=get_4byte(0xb7,0x46,0x06,0x0c);
  81.         data_array[2]=get_4byte(0x00,0x00,0x00,00);
  82.         dsi_set_cmdq(&data_array, 3, 1);
  83.         MDELAY(3);

  84.         write_nbyte(3);
  85.         data_array[1]=get_4byte(0xc0,0x01,0x15,00);
  86.         dsi_set_cmdq(&data_array, 2, 1);
  87.         MDELAY(10);

  88.           write_nbyte(6);
  89.         data_array[1]=get_4byte(0xc3,0x07,0x03,0x04);
  90.         data_array[2]=get_4byte(0x04,0x04,0x00,00);
  91.         dsi_set_cmdq(&data_array, 3, 1);
  92.         MDELAY(3);

  93.     write_nbyte(7);
  94.         data_array[1]=get_4byte(0xc4,0x12,0x24,0x13);
  95.         data_array[2]=get_4byte(0x13,0x02,0x49,00);
  96.         dsi_set_cmdq(&data_array, 3, 1);
  97.         MDELAY(3);

  98.     write_2byte(0xc5,0x67);

  99.         write_nbyte(3);
  100.         data_array[1]=get_4byte(0xc6,0x41,0x63,00);
  101.         dsi_set_cmdq(&data_array, 2, 1);
  102.         MDELAY(10);

  103.         write_nbyte(10);
  104.         data_array[1]=get_4byte(0xd0,0x00,0x07,0x60);
  105.         data_array[2]=get_4byte(0x25,0x07,0x02,0x50);
  106.         data_array[3]=get_4byte(0x26,0x05,0x00,0x00);
  107.         dsi_set_cmdq(&data_array, 4, 1);
  108.         MDELAY(10);

  109.         write_nbyte(10);
  110.         data_array[1]=get_4byte(0xd1,0x00,0x07,0x60);
  111.         data_array[2]=get_4byte(0x25,0x07,0x02,0x50);
  112.         data_array[3]=get_4byte(0x26,0x05,0x00,0x00);
  113.         dsi_set_cmdq(&data_array, 4, 1);
  114.         MDELAY(10);

  115.         write_nbyte(10);
  116.         data_array[1]=get_4byte(0xd2,0x00,0x07,0x60);
  117.         data_array[2]=get_4byte(0x25,0x07,0x02,0x50);
  118.         data_array[3]=get_4byte(0x26,0x05,0x00,0x00);
  119.         dsi_set_cmdq(&data_array, 4, 1);
  120.         MDELAY(10);

  121.         write_nbyte(10);
  122.         data_array[1]=get_4byte(0xd3,0x00,0x07,0x60);
  123.         data_array[2]=get_4byte(0x25,0x07,0x02,0x50);
  124.         data_array[3]=get_4byte(0x26,0x05,0x00,0x00);
  125.         dsi_set_cmdq(&data_array, 4, 1);
  126.         MDELAY(10);

  127.         write_nbyte(10);
  128.         data_array[1]=get_4byte(0xd4,0x00,0x07,0x60);
  129.         data_array[2]=get_4byte(0x25,0x07,0x02,0x50);
  130.         data_array[3]=get_4byte(0x26,0x05,0x00,0x00);
  131.         dsi_set_cmdq(&data_array, 4, 1);
  132.         MDELAY(10);

  133.         write_nbyte(10);
  134.         data_array[1]=get_4byte(0xd5,0x00,0x07,0x60);
  135.         data_array[2]=get_4byte(0x25,0x07,0x02,0x50);
  136.         data_array[3]=get_4byte(0x26,0x05,0x00,0x00);
  137.         dsi_set_cmdq(&data_array, 4, 1);
  138.         MDELAY(10);

  139.         data_array[0] = 0x00110500;        // Sleep Out
  140.         dsi_set_cmdq(&data_array, 1, 1);
  141.   
  142.         MDELAY(200);

  143.     data_array[0] = 0x00290500; // Display On
  144.     dsi_set_cmdq(&data_array, 1, 1);
  145.     MDELAY(20);

  146. }
  147. // ---------------------------------------------------------------------------
  148. //  LCM Driver Implementations
  149. // ---------------------------------------------------------------------------

  150. static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) {
  151.     memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
  152. }


  153. static void lcm_get_params(LCM_PARAMS *params) {
  154.                 memset(params, 0, sizeof(LCM_PARAMS));
  155.         
  156.                 params->type   = LCM_TYPE_DSI;
  157. #if defined(LCM_DSI_CMD_MODE)
  158.                 params->dsi.mode   = CMD_MODE;
  159. #else
  160.                 params->dsi.mode   = SYNC_EVENT_VDO_MODE;
  161. #endif        

  162.                 //params->ctrl   = LCM_CTRL_NONE;
  163.                 params->width  = FRAME_WIDTH;
  164.                 params->height = FRAME_HEIGHT;
  165.         
  166.                 // enable tearing-free
  167.                 params->dbi.te_mode                                 = LCM_DBI_TE_MODE_VSYNC_ONLY; //add
  168.                 //params->dbi.te_mode                                 = LCM_DBI_TE_MODE_DISABLED;
  169.                 params->dbi.te_edge_polarity                = LCM_POLARITY_RISING;
  170.         
  171.             // DSI
  172.             /* Command mode setting */
  173.             params->dsi.LANE_NUM = LCM_TWO_LANE;
  174.             //The following defined the fomat for data coming from LCD engine.
  175.             params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
  176.             params->dsi.data_format.trans_seq   = LCM_DSI_TRANS_SEQ_MSB_FIRST;
  177.             params->dsi.data_format.padding     = LCM_DSI_PADDING_ON_LSB;
  178.             params->dsi.data_format.format      = LCM_DSI_FORMAT_RGB888;

  179.             // Highly depends on LCD driver capability.
  180.             params->dsi.packet_size=256;
  181.                
  182.                 params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
  183. //                params->dsi.word_count=480*3;
  184.         
  185.                 params->dsi.vertical_sync_active=2;
  186.                 params->dsi.vertical_backporch=2;
  187.                 params->dsi.vertical_frontporch=2;
  188.                 params->dsi.vertical_active_line=800;


  189.             params->dsi.horizontal_sync_active=10;
  190.             params->dsi.horizontal_backporch=20;
  191.             params->dsi.horizontal_frontporch=40;
  192.             params->dsi.horizontal_active_pixel=480;

  193.             params->dsi.intermediat_buffer_num=2;

  194.                 params->dsi.pll_div1=29;
  195.                 params->dsi.pll_div2=1;                        

  196. }


  197. static void lcm_init(void) {
  198. //    SET_RESET_PIN(1);
  199. //    MDELAY(5);
  200.     SET_RESET_PIN(0);
  201.     MDELAY(10);
  202.     SET_RESET_PIN(1);
  203.     MDELAY(100);

  204.     init_lcm_registers();
  205. }

  206. #ifdef BUILD_UBOOT
  207. void mt65xx_disp_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height);
  208. #else
  209. unsigned int DISP_UpdateScreen(unsigned int x, unsigned int y, unsigned int width, unsigned int height);
  210. #endif

  211. static void lcm_suspend(void)
  212. {
  213.        unsigned int data_array[16];

  214.         data_array[0]=0x00280500; // Display Off
  215.         dsi_set_cmdq(&data_array, 1, 1);
  216.         MDELAY(10);
  217.         data_array[0] = 0x00100500; // Sleep In
  218.         dsi_set_cmdq(&data_array, 1, 1);
  219.         MDELAY(100);
  220. }

  221. static void lcm_resume(void)
  222. {
  223.         unsigned int data_array[16];
  224.         data_array[0] = 0x00110500; // Sleep Out
  225.         dsi_set_cmdq(&data_array, 1, 1);
  226.         MDELAY(50);
  227.         data_array[0] = 0x00290500;        // Display On
  228.         dsi_set_cmdq(&data_array, 1, 1);
  229.         //MDELAY(150);
  230.         MDELAY(3);
  231. }


  232. static void lcm_update(unsigned int x, unsigned int y,
  233.                        unsigned int width, unsigned int height)
  234. {
  235.         unsigned int x0 = x;
  236.         unsigned int y0 = y;
  237.         unsigned int x1 = x0 + width - 1;
  238.         unsigned int y1 = y0 + height - 1;

  239.         unsigned char x0_MSB = ((x0>>8)&0xFF);
  240.         unsigned char x0_LSB = (x0&0xFF);
  241.         unsigned char x1_MSB = ((x1>>8)&0xFF);
  242.         unsigned char x1_LSB = (x1&0xFF);
  243.         unsigned char y0_MSB = ((y0>>8)&0xFF);
  244.         unsigned char y0_LSB = (y0&0xFF);
  245.         unsigned char y1_MSB = ((y1>>8)&0xFF);
  246.         unsigned char y1_LSB = (y1&0xFF);

  247.         unsigned int data_array[16];

  248.         data_array[0]= 0x00053902;
  249.         data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a;
  250.         data_array[2]= (x1_LSB);
  251.         data_array[3]= 0x00053902;
  252.         data_array[4]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b;
  253.         data_array[5]= (y1_LSB);
  254.         data_array[6]= 0x002c3909;
  255.         dsi_set_cmdq(&data_array, 7, 0);

  256. }

  257. #define LINGLONG_LG_MODULE_ADC_MAX 2600
  258. #define LINGLONG_LG_MODULE_ADC_MIN 2200

  259. extern int IMM_GetOneChannelValue(int dwChannel, int deCount);


  260. LCM_DRIVER lg4572_lcm_drv =
  261. {
  262.     .name                        = "lg4572",
  263.         .set_util_funcs = lcm_set_util_funcs,
  264.         .get_params     = lcm_get_params,
  265.         .init           = lcm_init,
  266.         .suspend        = lcm_suspend,
  267.         .resume         = lcm_resume,
  268. #if defined(LCM_DSI_CMD_MODE)
  269.     .update         = lcm_update,
  270. #endif
  271.     };

复制代码

不错,大家一起来表扬

哥们,能共享下LG4572规格书不?不胜感激额!

有LG4573的初始化代码吗?

void LCD_Init(void)
{
        unsigned char i;
    SPI_CS=0;
       
        SPI_RES=1;
        Delay(50);
        SPI_RES=0;
    Delay(800);
    SPI_RES=1;
        Delay(800);
                  SPI_WriteComm(0xC0 );
                  SPI_WriteData(0x01);
                  SPI_WriteData(0x18);

                  SPI_WriteComm(0x20);                 
                  SPI_WriteComm(0x29);                  
                  SPI_WriteComm(0x3A);
                  SPI_WriteData(0x77);
                  SPI_WriteComm(0xB1);
                  SPI_WriteData(0x06 );
                  SPI_WriteData(0x1E);
                  SPI_WriteData(0x0C);

                  SPI_WriteComm(0xB2 );
                  SPI_WriteData(0x00);
                  SPI_WriteData(0xC8);  
                  
                  SPI_WriteComm (0xB3 );
                  SPI_WriteData(0x00);                  
                  
                  SPI_WriteComm(0xB4 );
                  SPI_WriteData(0x04);

                  SPI_WriteComm(0xB5 );
                  SPI_WriteData(0x20);
                  SPI_WriteData(0x30);
                  SPI_WriteData(0x30);
                  SPI_WriteData(0x00);
                  SPI_WriteData(0x00);
                 
                  SPI_WriteComm(0xB6 );
                  SPI_WriteData(0x0b);
                  SPI_WriteData(0x0f);
                  SPI_WriteData(0x3C);
                  SPI_WriteData(0x13);
                  SPI_WriteData(0x13);
                  SPI_WriteData(0xe8);

                  SPI_WriteComm(0xB7 );
                  SPI_WriteData(0x46);
                  SPI_WriteData(0x06);
                  SPI_WriteData(0x0C);
                  SPI_WriteData(0x00);
                  SPI_WriteData(0x00);

                  SPI_WriteComm(0xC3 );
                  SPI_WriteData(0x07);
                  SPI_WriteData(0x03);
                  SPI_WriteData(0x04);
                  SPI_WriteData(0x04);
                  SPI_WriteData(0x04);

                  SPI_WriteComm(0xC4 );
                  SPI_WriteData(0x12);
                  SPI_WriteData(0x23);
                  SPI_WriteData(0x12);
                  SPI_WriteData(0x12);
                  SPI_WriteData(0x01);
                  SPI_WriteData(0x6D);

                  SPI_WriteComm(0xC5);
                  SPI_WriteData(0x70);

                  SPI_WriteComm(0xC6 );
                  SPI_WriteData(0x44);        
                  SPI_WriteData(0x63);         
                  SPI_WriteData(0x03);        
                                             
                  SPI_WriteComm(0xD0 );
                  SPI_WriteData(0x21);      
                  SPI_WriteData(0x43);      
                  SPI_WriteData (0x44);      
                  SPI_WriteData(0x25);         
                  SPI_WriteData(0x05);        
                  SPI_WriteData(0x01);                 
                  SPI_WriteData(0x61);      
                  SPI_WriteData(0x16);        
                  SPI_WriteData(0x02);           
                  
                  SPI_WriteComm(0xD1 );
                  SPI_WriteData(0x21);      
                  SPI_WriteData(0x43);      
                  SPI_WriteData (0x44);      
                  SPI_WriteData(0x25);         
                  SPI_WriteData(0x05);        
                  SPI_WriteData(0x01);                 
                  SPI_WriteData(0x61);      
                  SPI_WriteData(0x16);        
                  SPI_WriteData(0x02);  
                  
                  SPI_WriteComm(0xD2 );
                  SPI_WriteData(0x21);      
                  SPI_WriteData(0x43);      
                  SPI_WriteData (0x44);      
                  SPI_WriteData(0x25);         
                  SPI_WriteData(0x05);        
                  SPI_WriteData(0x01);                 
                  SPI_WriteData(0x61);      
                  SPI_WriteData(0x16);        
                  SPI_WriteData(0x02);                    
                  
                  SPI_WriteComm(0xD3 );
                  SPI_WriteData(0x21);      
                  SPI_WriteData(0x43);      
                  SPI_WriteData (0x44);      
                  SPI_WriteData(0x25);         
                  SPI_WriteData(0x05);        
                  SPI_WriteData(0x01);                 
                  SPI_WriteData(0x61);      
                  SPI_WriteData(0x16);        
                  SPI_WriteData(0x02);
                  
                  SPI_WriteComm(0xD4 );
                  SPI_WriteData(0x21);      
                  SPI_WriteData(0x43);      
                  SPI_WriteData (0x44);      
                  SPI_WriteData(0x25);         
                  SPI_WriteData(0x05);        
                  SPI_WriteData(0x01);                 
                  SPI_WriteData(0x61);      
                  SPI_WriteData(0x16);        
                  SPI_WriteData(0x02);                     
                  
                  SPI_WriteComm(0xD5 );
                  SPI_WriteData(0x21);      
                  SPI_WriteData(0x43);      
                  SPI_WriteData (0x44);      
                  SPI_WriteData(0x25);         
                  SPI_WriteData(0x05);        
                  SPI_WriteData(0x01);                 
                  SPI_WriteData(0x61);      
                  SPI_WriteData(0x16);        
                  SPI_WriteData(0x02);

                  SPI_WriteComm(0x11 );
                  Delay(200);
                  SPI_WriteComm(0x29 );
}
LG4573的,,你可以试试

能否加一下你的微信

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top