概述
一、简介
本文是基于高通msm8953的LCD模块移植说明。LCD移植主要是涉及到LK和kernel部分的修改。
二、实操准备
1、专业术语
HSYNC:行同步信号,表示扫描1行的开始。
VSYNC:帧同步信号,表示扫描1帧的开始,一帧也就是LCD显示的一个画面。
HFP:Horizon front porch
水平前沿,在每行或每列的象素结束到LCD 行时钟输出脉冲之间的像素时钟数
HBP:Horizon back porch
水平后沿,是指在每行或每列的象素数据开始输出时要插入的像素时钟周期数
VFP:Vertical front porch
垂直前沿,本帧数据输出结束到下一帧垂直同步周期开始之前的无效行数
VBP:Vertical back porch
垂直后沿,在垂直同步周期之后帧开头时的无效行数
HDP:Horizon display period
VDP:Vertical display period
HPW:Hsync plus width
行同步脉宽。单位:像素时钟周期
VPW:Vsync plus width
垂直同步脉宽。单位:显示一行的时间
时序属性如下:
2、常识必备
1、像素(pixel)
整个图像是由一个个的像素组成的,像素就是一个显示点。
2、像素间距(pitch)
pitch是连续2个像素的像素中心的距离。
3、像素深度/位数(bits per pixel,简称bpp)
一个像素在计算机中由多少个位来描述。常见的像素深度:1位、8位、16位、24位、32位
4、分辨率(resolution)
屏幕的横向和纵向的像素个数就叫分辨率。屏幕尺寸和分辨率无关的,屏幕尺寸是指屏幕的对角线尺寸。屏幕尺寸和分辨率、像素间距三者之间有关联。
3、文件部分
1)屏厂商提供的屏初始化命令数据、面板参数等
2)高通80-NH713-1_Y_DSI_Timing_Parameters_User_Interactive_Spreadsheet.xls
4、DSI数据帧格式说明
qcom,mdss-dsi-on-command含义说明:
byte 0: dcs data type 数据类型如上
byte 1: set to indicate this is an individual packet
value: 01 (indicates this is an individual packet)
00 (indicates this will be appended to the next individual packet in the packet stream)
byte 2: virtual channel number
byte 3: expect ack from client (dcs read command)
byte 4: wait number of specified ms after dcs command
transmitted
byte 5, 6: 16 bits length in network byte order
byte 7 and beyond: number byte of payload
常用的数据格式:
1)0x05 DCS WRITE,no parameters
05 01 00 00 32 00 02 28 00
05:数据类型
01 00 00:分别表示单帧、虚拟信道号、请求应答标志位
0x32:该帧发完延时时间毫秒,即为50ms
00 02:长度
28 00:payload,即数据(寄存器地址+数据)
2)0x15 DCS WRITE,1 parameter
15 01 00 00 c8 00 02 11 00
3)0x29 Generic Long Write
29 01 00 00 00 00 02 53 24
4)0x39 DCS Long Write Command Packet
39 01 00 00 0A 00 02 29 00
5)0x13 Generic Short WRITE,1 parameter
13 01 00 00 00 00 02 BC 46
三、实际操作说明
1、.H和dtsi文件生成
可通过device/qcom/common/display/tools/parser.pl脚本生成.h和dts文件。
命令为:perl parser.pl panel_xxx_xxx_xxx.xml panel
注:
1)xml文件可拷贝现成的,在生成目标文件后,根据实际屏信息进行配置修改。
2)生成文件为*.h和*.dtsi。其中.h放置lk/dev/gcdb/display/include/panel_lt8911b_1080p_video.h,dtsi文件放置到kernel/msm-4.9/arch/arm64/boot/dts/qcom/dsi-panel-lt8911b-1080p-video.dtsi。
2、LK修改
1)target/msm8953/oem_panel.c文件
1.1)引入面板数据的头文件
#include "include/panel_lt8911b_1080p_video.h"
1.2)枚举变量中声明面板id
enum {
LT8911B_1080P_VIDEO_PANEL,
};
1.3)目标面板支持列表中增加面板名字和id
static struct panel_list supp_panels[] = {
{"dsi_lt8911b_1080p_video", LT8911B_1080P_VIDEO_PANEL},
};
1.4)根据面板id和数据初始化面板
static int init_panel_data(struct panel_struct *panelstruct,
struct msm_panel_info *pinfo,
struct mdss_dsi_phy_ctrl *phy_db)
...
switch (panel_id) {
case LT8911B_1080P_VIDEO_PANEL:
panelstruct->paneldata = <8911b_1080p_video_panel_data;
panelstruct->panelres = <8911b_1080p_video_panel_res;
panelstruct->color = <8911b_1080p_video_color;
panelstruct->videopanel = <8911b_1080p_video_video_panel;
panelstruct->commandpanel = <8911b_1080p_video_command_panel;
panelstruct->state = <8911b_1080p_video_state;
panelstruct->laneconfig = <8911b_1080p_video_lane_config;
panelstruct->paneltiminginfo
= <8911b_1080p_video_timing_info;
panelstruct->panelresetseq
= <8911b_1080p_video_reset_seq;
panelstruct->backlightinfo = <8911b_1080p_video_backlight;
pinfo->mipi.panel_on_cmds = lt8911b_1080p_video_on_command;
pinfo->mipi.num_of_panel_on_cmds
= LT8911B_1080P_VIDEO_ON_COMMAND;
pinfo->mipi.panel_off_cmds = NULL;
pinfo->mipi.num_of_panel_off_cmds = 0;
memcpy(phy_db->timing,
lt8911b_1080p_video_timings,
MAX_TIMING_CONFIG * sizeof(uint32_t));
pinfo->mipi.signature = LT8911B_1080P_VIDEO_SIGNATURE;
panelstruct->paneldata->panel_operating_mode &= ~USE_DSI1_PLL_FLAG;
break;
}
...
1.5)获取panel_id,以便进行不同屏的初始化
int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
struct msm_panel_info *pinfo,
struct mdss_dsi_phy_ctrl *phy_db)
{
...
}
注:panel_id的获取逻辑可根据实际情况定义。
2).h文件相关配置说明
1.1)时序说明
static const uint32_t lt8911b_1080p_video_timings[] = {
0x1b, 0x09, 0x08, 0x00, 0x24, 0x1f, 0x08, 0x09, 0x05, 0x03, 0x04, 0x00
通过excel表格生成的时序是11字节,而此处的数组是12字节,所要补一个字节0x00。
1.2)panel_config说明
static struct panel_config lt8911b_1080p_video_panel_data = {
"qcom,mdss_dsi_lt8911b_1080p_video", "dsi:0:", "qcom,mdss-dsi-panel",
10, 0, "DISPLAY_1", 0, 0, 60, 0, 0, 0, 1, 10000, 0, 0, 0, 0, 0, 0, NULL
};
通过xml文件生成时会少2个字节,所以要补两个字节的0或NULL。
1.3)on/off命令说明
若不够为了对齐可补0或0xff。
注:
屏厂商提供的命令信息的一般格式为[长度 寄存器地址 数据]
长度包括寄存器地址 + 数据长度,形如:
...
DSI_CMD(0x03,0xB2);Set RSO
DSI_PA(0x40); //1 1280Gate
DSI_PA(0x08); //2 800RGB
...
DSI_CMD(0x01,0x11); Sleep Out
DelayX1ms(250);
...
另外时间一般是通过dsi的格式上配置。
2、kernel修改
1)kernelmsm-4.9archarm64bootdtsqcommsm8953-mdss-panels.dtsi文件
1.1)导入屏的dtsi文件
#include "dsi-panel-lt8911b-1080p-video.dtsi"
1.2)若需要旋转180°则添加如下语句
&dsi_lt8911b_1080p_dsi_video {
qcom,mdss-dsi-panel-orientation = "180";
};
3、屏参数说明
此处基于dtsi文件的配置进行说明
1)基本配置信息说明
//分辨率
qcom,mdss-dsi-panel-width = <1920>;
qcom,mdss-dsi-panel-height = <1080>;
qcom,mdss-dsi-h-front-porch = <88>;//水平前沿
qcom,mdss-dsi-h-back-porch = <148>;//水平后沿
qcom,mdss-dsi-h-pulse-width = <44>;//水平脉冲宽度
qcom,mdss-dsi-h-sync-skew = <0>;
qcom,mdss-dsi-v-back-porch = <36>;//垂直后沿
qcom,mdss-dsi-v-front-porch = <4>;//垂直后沿
qcom,mdss-dsi-v-pulse-width = <5>;//垂直脉冲宽度
//左边框、右边框、上边框、下边框
qcom,mdss-dsi-h-left-border = <0>;
qcom,mdss-dsi-h-right-border = <0>;
qcom,mdss-dsi-v-top-border = <0>;
qcom,mdss-dsi-v-bottom-border = <0>;
qcom,mdss-dsi-bpp = <24>;//像素深度
//上电命令、下电命令(一般由屏厂商提供),并且遵循dsi帧数据协议格式。
qcom,mdss-dsi-on-command = [
29 01 00 00 02 00 06 A0 06 87 30 10 10
29 01 00 00 02 00 06 A0 07 02 30 10 10
...
29 01 00 00 00 00 06 00 06 41 00 00 00
29 01 00 00 00 00 06 00 06 43 00 00 00
29 01 00 00 00 00 06 10 05 01 00 00 00
];
qcom,mdss-dsi-off-command = [
29 01 00 00 14 00 06 00 06 01 00 00 00
29 01 00 00 14 00 06 00 06 00 00 00 00
];
//传输模式
qcom,mdss-dsi-on-command-state = "dsi_lp_mode";
qcom,mdss-dsi-off-command-state = "dsi_hs_mode";
//时序,同.h需要补一位0x00。后文详解
qcom,mdss-dsi-panel-timings = [
E6 38 26 00 68 6C 2A 3A 2C 03 04 00];
qcom,mdss-dsi-t-clk-post = <0x02>;//模式切换后的字节时钟周期
qcom,mdss-dsi-t-clk-pre = <0x2B>;//模式切换前的字节时钟周期
//背光的等级划分
qcom,mdss-dsi-bl-min-level = <1>;
qcom,mdss-dsi-bl-max-level = <4095>;
//复位引脚的时序,格式为<电平 时间(毫秒级)>
qcom,mdss-dsi-reset-sequence = <1 20>, <0 20>, <1 20>;
//时序2,后文讲解
qcom,mdss-dsi-panel-timings-phy-v2 = [
24 1f 08 09 05 03 04 a0 /*Data 0*/
24 1f 08 09 05 03 04 a0 /*Data 1*/
24 1f 08 09 05 03 04 a0 /*Data 2*/
24 1f 08 09 05 03 04 a0 /*Data 3*/
24 1b 08 09 05 03 04 a0 /*CLK lane*/
];
//背光、复位、pwm引脚。主要是根据硬件配置。
qcom,platform-bklight-en-gpio = <&tlmm 137 0>;
qcom,platform-reset-gpio = <&tlmm 61 0>;
qcom,mdss-dsi-pwm-gpio = <&pm8953_mpps 4 0>;
//背光控制方式
qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";
//pwm频率
qcom,mdss-dsi-bl-pmic-pwm-frequency = <1000>;
2)Timing时序计算及说明
主要是介绍80-NH713-1_Y_DSI_Timing_Parameters_User_Interactive_Spreadsheet.xlsm文档的使用。
该文档需要使用微软的EXCEL打开,如果使用WPS需自行下载组件才可,并且需要打开VBA宏。
在DSI and MDP registers表中,需根据实际屏信息填写。如下:
切换到DSI PHY timing setting表中,分别按下CTRL+J、CTRL+L,如下:
出现VALID 即说明参数校验成功。DSI PHY timing setting表中数据对应qcom,mdss-dsi-panel-timings的数据。即转化为:
qcom,mdss-dsi-panel-timings = [
49 0C 06 00 28 2C 0A 10 09 03 04 00]; //补一个字节0x00
qcom,mdss-dsi-t-clk-post = <0x05>;
qcom,mdss-dsi-t-clk-pre = <0x12>
DSI PHY 2.0.0 timing setting中的数据如下:
DSI PHY 2.0.0 timing setting表中的数据对应qcom,mdss-dsi-panel-timings-phy-v2。即转化为:
qcom,mdss-dsi-panel-timings-phy-v2 = [
1C 19 02 03 01 03 04 a0 /Data 0/
1C 19 02 03 01 03 04 a0 /Data 1/
1C 19 02 03 01 03 04 a0 /Data 2/
1C 19 02 03 01 03 04 a0 /Data 3/
1C 07 02 03 01 03 04 a0 /CLK lane/
];
注:最后要补一个字节0xa0。
具体数据说明:
四、总结
msm8953 LCD移植主要的修改是LK和Kernel,一般是根据现成的.H和.DTSI 文件重新拷贝一份,然后根据屏的参数信息进行修改。
最后
以上就是落后飞机为你收集整理的msm8953 LCD移植详解的全部内容,希望文章能够帮你解决msm8953 LCD移植详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复