全志 mipi屏幕和触摸驱动调试记录

编程入门 行业动态 更新时间:2024-10-25 10:29:01

全志 mipi<a href=https://www.elefans.com/category/jswz/34/1767915.html style=屏幕和触摸驱动调试记录"/>

全志 mipi屏幕和触摸驱动调试记录

第一步 查看原理图、全志硬件手册、屏幕手册

这个就不全部贴出来了

第二步 配置屏

路径:/root/workspace/allwinner/lichee/tools/pack/chips/sun8iw11p1/configs/a40-OKA40i_C/sys_config1024x600mipi.fex

;disp init configuration
fb0_width                = 800
fb0_height               = 1280
;lcd0 configuration
lcd_used            = 1
lcd_driver_name     = "tft720x1280"  ;与驱动名称一致,我没有新增,直接用已支持的驱动改的
lcd_backlight       = 255
lcd_if              = 4
lcd_x               = 800                          ;根据屏幕厂家提供的填写,有些屏幕x与y是反过来的
lcd_y               = 1280                        ;根据屏幕厂家提供的填写,有些屏幕x与y是反过来的
ctp_touch_panel_max_x  = 800
ctp_touch_panel_max_y  = 480
lcd_width           =
lcd_height          =
lcd_dclk_freq       = 72                        ;传输像素传送频率。单位为MHz。lcd_dclk_freq=lcd_htlcd_vt,算出来的值再稍微大一些,我这边算出来是69左右,我用了72
lcd_pwm_used        = 1                      ;此参数标识是否使用pwm 用以背光亮度的控制。我这边使用pwm进行控制背光,也定义了对应的lcd_bl_en来控制背光
lcd_pwm_ch          = 1                        ; 此参数标识使用的Pwm 通道,这里是指使用SoC 哪个pwm 通道,通过查看原理图连接可知。我这边使用了1通道
lcd_pwm_freq        = 50000
lcd_pwm_pol         = 0
lcd_pwm_max_limit   = 255lcd_hbp             = 56                          ;根据如上图屏幕手册Input Timing定义对应值计算:THS+THB得出
lcd_ht              = 908                          ;lcd_x+HS+HBP+HFP,如果屏幕手册已经有HT则直接填就行
lcd_hspw            = 8                           ;根据如上图屏幕手册Input Timing定义填写
lcd_vbp             = 22                          ;根据如上图屏幕手册Input Timing定义对应值计算:TVS+TVB得出
lcd_vt              = 1317                         ;lcd_y+VS+VBP+VFP,如果屏幕手册已经有VT则直接填就行
lcd_vspw            = 6                           ;根据如上图屏幕手册Input Timing定义填写
lcd_lvds_if         = 0
lcd_lvds_colordepth = 1
lcd_lvds_mode       = 0
lcd_frm             = 0
lcd_hv_clk_phase    = 0
lcd_hv_sync_polarity= 0
lcd_gamma_en        = 0
lcd_bright_curve_en = 0
lcd_cmap_en         = 0
lcd_dsi_if          = 0                             ;0:Video mode     1:Command mode      2:video burst mode ,我当时没有在意这个参数,我设置了1,然后一直背光亮,屏幕黑,后面改成0后,屏幕正常点亮
lcd_dsi_lane        = 4                          ;屏幕支持的通道数,从1开始,1:1 data lane     2:2 data lane      3:3 data lane       4:4 data lane
lcd_dsi_format      = 0                        ;0:Package Pixel Stream, 24bit RGB   1:Loosely Package Pixel Stream, 18bit RGB    2:Package Pixel Stream, 18bit RGB        3:Package Pixel Stream, 16bit RGB
lcd_dsi_te          = 1                            ;0:frame trigged automatically     1:frame trigged by te rising edge    2:frame trigged by te falling edgedeu_mode            = 0
lcdgamma4iep        = 22
smart_color         = 90lcd_bl_en           = port:PB3<1><0><default><1>           ;根据原理图和全志硬件手册填写背光引脚
lcd_gpio_0           = port:PH11<1><0><default><1>      ;根据原理图和全志硬件手册填写电源使能(复位)引脚
lcd_power           = "vcc-lcd"                                              ;3.3v屏幕供电
lcd_power1           = "vcc-lcd"

第三步  增加屏幕驱动

注意:如果是新增文件则需要在panel、makefile等文件中按要求新增

1.关注是否需要初始化屏幕的指令序列,我这边是需要的,问屏幕厂家要即可

2.关注屏幕的打开电源与关闭电源的时序,从屏幕手册可以查到,如第一步的图2

3.关注屏幕背光打开与关闭

4.如果需要在boot启动过程中就要显示,需要在u-boot源码中修改对应驱动,和内核保持一致。

驱动源码如下:

u-boot路径:/root/workspace/allwinner/lichee/brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/lcd/tft720x1280.c

内核路径:/root/workspace/allwinner/lichee/linux-3.10/drivers/video/sunxi/disp2/disp/lcd/tft720x1280.c

#include "tft720x1280.h"extern s32 bsp_disp_get_panel_info(u32 screen_id, disp_panel_para *info);
static void LCD_power_on(u32 sel);
static void LCD_power_off(u32 sel);
static void LCD_bl_open(u32 sel);
static void LCD_bl_close(u32 sel);static void LCD_panel_init(u32 sel);
static void LCD_panel_exit(u32 sel);#define dsi_dcs_wr_0para sunxi_lcd_dsi_dcs_write_0para
#define dsi_dcs_wr_1para sunxi_lcd_dsi_dcs_write_1para
#define dsi_dcs_wr_2para sunxi_lcd_dsi_dcs_write_2para
#define dsi_dcs_wr_3para sunxi_lcd_dsi_dcs_write_3para
#define dsi_dcs_wr_4para sunxi_lcd_dsi_dcs_write_4para
#define dsi_dcs_wr_5para sunxi_lcd_dsi_dcs_write_5para
#define delayms sunxi_lcd_delay_ms#define panel_reset(val)     sunxi_lcd_gpio_set_value(sel, 0, val)
#define power_en(val)        sunxi_lcd_gpio_set_value(sel, 1, val)#define REGFLAG_DELAY             						0xFE
#define REGFLAG_END_OF_TABLE      						0xFD   // END OF REGISTERS MARKERstruct LCM_setting_table {unsigned cmd;unsigned char count;unsigned char para_list[64];
};static struct LCM_setting_table lcm_initialization_setting[] = {//Page0{0xFF, 3, {0x98, 0x81, 0x03} },{0x01, 1, {0x00}},{0x02, 1, {0x00}},{0x03, 1, {0x53}},{0x04, 1, {0x53}},{0x05, 1, {0x13}},{0x06, 1, {0x04}},{0x07, 1, {0x02}},{0x08, 1, {0x02}},{0x09, 1,{0x00}},{0x0A, 1,{0x00}},{0x0B, 1,{0x00}},{0x0C, 1,{0x00}},{0x0D, 1,{0x00}},{0x0E, 1,{0x00}},{0x0F, 1,{0x00}},{0x10, 1,{0x00}},{0x11, 1,{0x00}},{0x12, 1,{0x00}},{0x13, 1,{0x00}},{0x14, 1,{0x00}},{0x15, 1,{0x00}},{0x16, 1,{0x00}},{0x17, 1,{0x00}},{0x18, 1,{0x00}},{0x19, 1,{0x00}},{0x1A, 1,{0x00}},{0x1B, 1,{0x00}},{0x1C, 1,{0x00}},{0x1D, 1,{0x00}},{0x1E, 1,{0xc0}},{0x1F, 1,{0x00}},{0x20, 1,{0x02}},{0x21, 1,{0x09}},{0x22, 1,{0x00}},{0x23, 1,{0x00}},{0x24, 1,{0x00}},{0x25, 1,{0x00}},{0x26, 1,{0x00}},{0x27, 1,{0x00}},{0x28, 1,{0x55}},{0x29, 1,{0x03}},{0x2A, 1,{0x00}},{0x2B, 1,{0x00}},{0x2C, 1,{0x00}},{0x2D, 1,{0x00}},{0x2E, 1,{0x00}},{0x2F, 1,{0x00}},{0x30, 1,{0x00}},{0x31, 1,{0x00}},{0x32, 1,{0x00}},{0x33, 1,{0x00}},{0x34, 1,{0x00}},  // GPWR1/2 non overlap time 2.62us{0x35, 1,{0x00}},{0x36, 1,{0x00}},{0x37, 1,{0x00}},{0x38, 1,{0x3c}},{0x39, 1,{0x00}},{0x3A, 1,{0x00}},{0x3B, 1,{0x00}},{0x3C, 1,{0x00}},{0x3D, 1,{0x00}},{0x3E, 1,{0x00}},{0x3F, 1,{0x00}},{0x40, 1,{0x00}},{0x41, 1,{0x00}},{0x42, 1,{0x00}},{0x43, 1,{0x00}},{0x44, 1,{0x00}},
//{0x45, 1,{0x00}},{0x50, 1, {0x01} },{0x51, 1, {0x23} },{0x52, 1, {0x45} },{0x53, 1, {0x67} },{0x54, 1, {0x89} },{0x55, 1, {0xAB} },{0x56, 1, {0x01} },{0x57, 1, {0x23} },{0x58, 1, {0x45} },{0x59, 1, {0x67} },{0x5A, 1, {0x89} },{0x5B, 1, {0xAB} },{0x5C, 1, {0xCD} },{0x5D, 1, {0xEF} },{0x5E, 1, {0x01} },{0x5F, 1, {0x0A} },{0x60, 1, {0x02} },{0x61, 1, {0x02} },{0x62, 1, {0x08} },{0x63, 1, {0x15} },{0x64, 1, {0x14} },{0x65, 1, {0x02} },{0x66, 1, {0x11} },{0x67, 1, {0x10} },{0x68, 1, {0x02} },{0x69, 1, {0x0F} },{0x6A, 1, {0x0E} },{0x6B, 1, {0x02} },{0x6C, 1, {0x0D} },{0x6D, 1, {0x0C} },{0x6E, 1, {0x06} },{0x6F, 1, {0x02} },{0x70, 1, {0x02} },{0x71, 1, {0x02} },{0x72, 1, {0x02} },{0x73, 1, {0x02} },{0x74, 1, {0x02} },{0x75, 1, {0x0A} },{0x76, 1, {0x02} },{0x77, 1, {0x02} },{0x78, 1, {0x06} },{0x79, 1, {0x15} },{0x7A, 1, {0x14} },{0x7B, 1, {0x02} },{0x7C, 1, {0x10} },{0x7D, 1, {0x11} },{0x7E, 1, {0x02} },{0x7F, 1, {0x0C} },{0x80, 1, {0x0D} },{0x81, 1, {0x02} },{0x82, 1, {0x0E} },{0x83, 1, {0x0F} },{0x84, 1, {0x08} },{0x85, 1, {0x02} },{0x86, 1, {0x02} },{0x87, 1, {0x02} },{0x88, 1, {0x02} },{0x89, 1, {0x02} },{0x8A, 1, {0x02} },//Page 4 command;{0xFF, 3,{0x98,0x81,0x04}},
//	{0x00, 1,{0x00}},//3L {0x3B, 1,{0xC0}},	 // ILI4003D sel{0x6C, 1,{0x15}},		//Set VCORE voltage =1.5V{0x6E, 1,{0x30}},		//2A  di_pwr_reg=0 for power mode 2A //VGH clamp 18V{0x6F, 1,{0x55}},	//45 //pumping ratio VGH=5x VGL=-3x 	   {0x3A, 1,{0x24}},{0x8D, 1, {0x1F} },{0x87, 1, {0xBA} },//{0x3A, 1, {0x24} },{0x26, 1,{0x76}},{0xB2, 1,{0xD1}},{0xB5, 1,{0x07}},{0x35, 1,{0x1F}},{0x88, 1,{0x0B}},{0x21, 1,{0x30}},//TEST
//	{0x2D, 1,{0xFF}},
//	{0x2F, 1,{0x01}},// Page 1 command {0xFF, 3,{0x98,0x81,0x01}},{0x22, 1,{0x0A}},		//BGR, SS
//	{0x53, 1,{0x40}},
//	{0x55, 1,{0x40}},{0x31, 1,{0x09}},		//Zigzag type3 inversion{0x40, 1,{0x33}},		// ILI4003D sel 		 
//	{0x43, 1,{0x66}},	  {0x53, 1,{0x37}},//4C		{0x55, 1, {0x38} },{0x50, 1, {0x95} },{0x51, 1, {0x95} },{0x60, 1, {0x30} },
//	{0x61, 1, {0x01} },
//	{0x62, 1, {0x0C} },
//	{0x63, 1, {0x00} },{0xA0, 1, {0x0f} },{0xA1, 1, {0x17} },{0xA2, 1, {0x22} },{0xA3, 1, {0x19} },{0xA4, 1, {0x15} },{0xA5, 1, {0x28} },{0xA6, 1, {0x1c} },{0xA7, 1, {0x1c} },{0xA8, 1, {0x78} },{0xA9, 1, {0x1c} },{0xAA, 1, {0x28} },{0xAB, 1, {0x69} },{0xAC, 1, {0x1a} },{0xAD, 1, {0x19}},		//VP36			{0xAE, 1, {0x4B}},		//VP24			{0xAF, 1, {0x22} },{0xB0, 1, {0x2a} },{0xB1, 1, {0x4b} },{0xB2, 1, {0x6b} },{0xB3, 1, {0x3F} },{0xC0, 1, {0x01} },{0xC1, 1, {0x17} },{0xC2, 1, {0x22} },{0xC3, 1, {0x19} },{0xC4, 1, {0x15} },{0xC5, 1, {0x28} },{0xC6, 1, {0x1c} },{0xC7, 1, {0x1D} },{0xC8, 1, {0x78} },{0xC9, 1, {0x1c} },{0xCA, 1, {0x28} },{0xCB, 1, {0x69} },{0xCC, 1, {0x1a} },{0xCD, 1, {0x19}},		//VN36			{0xCE, 1, {0x4B}},		//VN24			{0xCF, 1, {0x22}},		//VN16			{0xD0, 1, {0x2a}},		//VN12			{0xD1, 1, {0x4b}},		//VN8{0xD2, 1, {0x6b}},		//VN4{0xD3, 1, {0x3F}},		//VN0// Page 0 command{0xFF,3,{0x98,0x81,0x00}},//{0x35,1,{0x00}},  // TE On//{0x36,1,{0x03}}, {0x11,0,{0x00}},  // Sleep Out			{REGFLAG_DELAY, 130, {}},{0x29,0,{0x00}},  //  Display On {REGFLAG_DELAY, 30, {}},{REGFLAG_END_OF_TABLE, 0x00, {}}   
};static void LCD_cfg_panel_info(panel_extend_para * info)
{u32 i = 0, j=0;u32 items;u8 lcd_gamma_tbl[][2] ={//{input value, corrected value}{0, 0},{15, 15},{30, 30},{45, 45},{60, 60},{75, 75},{90, 90},{105, 105},{120, 120},{135, 135},{150, 150},{165, 165},{180, 180},{195, 195},{210, 210},{225, 225},{240, 240},{255, 255},};u32 lcd_cmap_tbl[2][3][4] = {{{LCD_CMAP_G0,LCD_CMAP_B1,LCD_CMAP_G2,LCD_CMAP_B3},{LCD_CMAP_B0,LCD_CMAP_R1,LCD_CMAP_B2,LCD_CMAP_R3},{LCD_CMAP_R0,LCD_CMAP_G1,LCD_CMAP_R2,LCD_CMAP_G3},},{{LCD_CMAP_B3,LCD_CMAP_G2,LCD_CMAP_B1,LCD_CMAP_G0},{LCD_CMAP_R3,LCD_CMAP_B2,LCD_CMAP_R1,LCD_CMAP_B0},{LCD_CMAP_G3,LCD_CMAP_R2,LCD_CMAP_G1,LCD_CMAP_R0},},};items = sizeof(lcd_gamma_tbl)/2;for (i=0; i<items-1; i++) {u32 num = lcd_gamma_tbl[i+1][0] - lcd_gamma_tbl[i][0];for (j=0; j<num; j++) {u32 value = 0;value = lcd_gamma_tbl[i][1] + ((lcd_gamma_tbl[i+1][1] - lcd_gamma_tbl[i][1]) * j)/num;info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] = (value<<16) + (value<<8) + value;}}info->lcd_gamma_tbl[255] = (lcd_gamma_tbl[items-1][1]<<16) + (lcd_gamma_tbl[items-1][1]<<8) + lcd_gamma_tbl[items-1][1];memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));printf("[disp]lcd720:%s\r\n",__func__);}static s32 LCD_open_flow(u32 sel)
{printf("[disp]lcd720:%s\r\n",__func__);LCD_OPEN_FUNC(sel, LCD_power_on, 120);   //open lcd power, and delay 50msLCD_OPEN_FUNC(sel, LCD_panel_init, 1);   //open lcd power, than delay 200msLCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 5);     //open lcd controller, and delay 100msLCD_OPEN_FUNC(sel, LCD_bl_open, 0);     //open lcd backlight, and delay 0msreturn 0;
}static s32 LCD_close_flow(u32 sel)
{printf("[disp]lcd720:%s\r\n",__func__);LCD_CLOSE_FUNC(sel, LCD_bl_close, 0);       //close lcd backlight, and delay 0msLCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 1);         //close lcd controller, and delay 0msLCD_CLOSE_FUNC(sel, LCD_panel_exit,	10);   //open lcd power, than delay 200msLCD_CLOSE_FUNC(sel, LCD_power_off, 0);   //close lcd power, and delay 500msreturn 0;
}static void LCD_power_on(u32 sel)
{/* set lcd-rst to 0 */panel_reset(0);/* vcc18-lcd */sunxi_lcd_power_enable(sel, 0);sunxi_lcd_delay_ms(50);/* vcc33-lcd */sunxi_lcd_power_enable(sel, 1);sunxi_lcd_delay_ms(100);sunxi_lcd_pin_cfg(sel, 1);sunxi_lcd_delay_ms(20);panel_reset(1);sunxi_lcd_delay_ms(50);panel_reset(0);sunxi_lcd_delay_ms(35);panel_reset(1);sunxi_lcd_delay_ms(50);
}static void LCD_power_off(u32 sel)
{printf("[disp]lcd720:%s\r\n",__func__);sunxi_lcd_delay_ms(20);panel_reset(0);sunxi_lcd_delay_ms(5);power_en(0);sunxi_lcd_delay_ms(10);sunxi_lcd_power_disable(sel, 1);sunxi_lcd_delay_ms(5);sunxi_lcd_power_disable(sel, 0);sunxi_lcd_pin_cfg(sel, 0);
}static void LCD_bl_open(u32 sel)
{printf("[disp]lcd720:%s\r\n",__func__);sunxi_lcd_backlight_enable(sel);//config lcd_bl_en pin to open lcd backlightsunxi_lcd_pwm_enable(sel);
}static void LCD_bl_close(u32 sel)
{printf("[disp]lcd720:%s\r\n",__func__);sunxi_lcd_backlight_disable(sel);//config lcd_bl_en pin to close lcd backlight
}static void LCD_panel_init(u32 sel)
{u32 i = 0;printf("[disp]lcd720:%s\r\n",__func__);sunxi_lcd_dsi_clk_enable(sel);sunxi_lcd_delay_ms(10);//sunxi_lcd_pin_cfg(sel, 1);//sunxi_lcd_delay_ms(20);//panel_reset(1);//sunxi_lcd_delay_ms(50);//panel_reset(0);//sunxi_lcd_delay_ms(35);//panel_reset(1);//sunxi_lcd_delay_ms(50);for (i = 0;; i++) {if (lcm_initialization_setting[i].cmd == REGFLAG_END_OF_TABLE)break;else if (lcm_initialization_setting[i].cmd == REGFLAG_DELAY)sunxi_lcd_delay_ms(lcm_initialization_setting[i].count);else {dsi_dcs_wr(0, lcm_initialization_setting[i].cmd,lcm_initialization_setting[i].para_list,lcm_initialization_setting[i].count);}}//sunxi_lcd_dsi_clk_enable(sel);//sunxi_lcd_delay_ms(10);return;
}static void LCD_panel_exit(u32 sel)
{printf("[disp]lcd720:%s\r\n",__func__);sunxi_lcd_dsi_dcs_write_0para(sel,DSI_DCS_SET_DISPLAY_OFF);sunxi_lcd_delay_ms(50);sunxi_lcd_dsi_dcs_write_0para(sel,DSI_DCS_ENTER_SLEEP_MODE);sunxi_lcd_delay_ms(20);return ;
}//sel: 0:lcd0; 1:lcd1
static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
{printf("[disp]lcd720:%s\r\n",__func__);return 0;
}__lcd_panel_t tft720x1280_panel = {/* panel driver name, must mach the name of lcd_drv_name in sys_config.fex */.name = "tft720x1280",.func = {.cfg_panel_info = LCD_cfg_panel_info,.cfg_open_flow = LCD_open_flow,.cfg_close_flow = LCD_close_flow,.lcd_user_defined_func = LCD_user_defined_func,},
};

第四步  配置触摸

[ctp]
compatible          = "allwinner,sun50i-ctp-para"
ctp_used            = 1
ctp_name         = "gt9xx_ts"            ;根据使用触摸芯片选择对应驱动,我这里用的是gt927
ctp_twi_id          = 4                         ;根据原理图确认使用的那组twi,我这里用的twi4
ctp_twi_addr        = 0x14                
ctp_screen_max_x    = 800               ;根据屏幕手册填写
ctp_screen_max_y    = 1280             ;根据屏幕手册填写
ctp_touch_panel_max_x  = 800
ctp_touch_panel_max_y  = 480
ctp_revert_x_flag   = 0
ctp_revert_y_flag   = 0
ctp_exchange_x_y_flag = 0
ctp_power_ldo       = "vcc-ctp"
ctp_power_ldo_vol   = 3300ctp_int_port        = port:PH09<6><default><default><default>       ;根据原理图和全志硬件手册进行填写
ctp_wakeup          = port:PH10<1><default><default><0>               ;根据原理图和全志硬件手册进行填写
[ctp_list]
compatible          = "allwinner,sun50i-ctp-list"
ctp_list_used        = 1                               ;使用ctp list
;ft5x_ts              = 1
;gt82x               = 1
gt9xx_ts         = 1                                     ;对应驱动使能;根据原理图和全志硬件手册进行填写
[twi4]
twi4_used        = 1
twi4_scl         = port:PI2<3><default><default><default>
twi4_sda         = port:PI3<3><default><default><default>

第五步 其他说明或调试方法

1.查看显示信息

这是vsync 中断的次数,每加1 都代表刷新了一帧,正常来说是一秒60(期望的fps)次,重复cat sys,如果无变化,则异常。

这个里面的irq、vsync等信息,正常情况下是会一直变化的,如果一直不动,就要检查fex中的相关配置参数是否正确,我这边就是因为lcd_dsi_if参数配置错误,irq等信息都不会变化,现象就是一直黑屏,背光亮。

2.查看电源信息

可确认屏幕电源与触屏电源是否存在

3.设置默认横屏或者竖屏

方式一(可行)

vim device/softwinner/a40-OKA40i_C/a40_OKA40i_C.mk

PRODUCT_PROPERTY_OVERRIDES += \

    ro.sf.lcd_density=160 \

    ro.display.sdcard=1 \

    ro.part.sdcard=1 \

    ro.sf.rotation=90     //增加角度来旋转

更多推荐

全志 mipi屏幕和触摸驱动调试记录

本文发布于:2024-02-24 21:52:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1696784.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:屏幕   mipi

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!