Android 9 设置双屏显示
平台模块输出mipi信号,通过lt8911exb转接芯片将信号转为edp信号,调试过程如下:
一、添加lt8911exb驱动文件:
1.将驱动文件复制到该路径下:drivers/video/fbdev/msm/
2.修改该目录下的Makefile和Kconfig;
3.在arch/arm64/configs/msm8953_defconfig(msm8953-perf_defconfig)文件中将驱动文件宏名称设为y并保存;
4.在arch/arm64/boot/dts/qcom/msm8953-mtp.dtsi中添加该驱动:
主屏的转接芯片驱动,挂载i2c_3上:

副屏的转接芯片驱动,挂载在i2c_2上:将副屏的背光控制脚加进去了,本来是在
arch/arm64/boot/dts/qcom/msm8953-nopmi-panel-camera.dtsi

&mdss_dsi1 {
//qcom,platform-bklight-en-gpio = <&tlmm 40 0>;
};
修改后报错,就没有在此处更改。

A = hact + hfp + hbp + hs = 1526
B = vact + vfp + vbp + vs = 790
plck = A × B × fp(60)
二、验证该驱动添加内核成功并执行了probe函数
1.编译make bootimage -j4 ; make dtboimage -j4;
2.烧录成功后,查看log:
3.若log中没有执行到probe函数,则需依次排查原因:
(1)cd out/target/product/msm8953_64/obj/KERNEL_OBJ/drivers/video/fbdev/msm/
查看目录下是否有目标驱动的中间文件;
(2)i2c:cat /sys/bus/i2c/devices/3-0029/name
ls /sys/bus/i2c/drivers/
查看驱动设备是否正常挂载到i2c总线上;
(3)dtsi:属性匹配名称是否完全一致;
三、配置LCD屏参数
配置分为两个阶段:lk阶段和kernel阶段。
准备:根据硬件电路确认lcd的vdd,reset,te,背光的GPIO,lcd屏为博立亚的15.6寸主屏,11.6的副屏;edp接口,1个edp通道;(项目使用了vdd,reset和背光引脚),通道速率分别是1.62G和2.7G。

lk阶段:
1.根据LCD规格书配置该文件的屏参数:bootable/bootloader/lk/dev/gcdb/display/include/panel_ili9881d_720p_video.h

static struct panel_config ili9881d_720p_video_panel_data = {
“qcom,mdss_dsi_ili9881d_720p_video”, /* panel_node_id /
“dsi:0:”, /
panel_controller /
“qcom,mdss-dsi-panel”, /
panel_compatible /
10, /
panel_interface /
0, /
panel_type /
“DISPLAY_1”, /
panel_destination /
0, /
panel_orientation /
0, /
panel_clockrate /
60, /
panel_framerate /
0, /
panel_channelid /
0, /
dsi_virtualchannel_id /
0, /
panel_broadcast_mode /
0, /
panel_lp11_init /
0, /
panel_init_delay /
0, /
dsi_stream /
0, /
interleave_mode /
0, /
panel_bitclock_freq /
0, /
panel_operating_mode /
0, /
panel_with_enable_gpio /
0, /
mode_gpio_state /
“qcom,mdss_dsi_ili9881d_720p_dsi1_video” /
添加副屏名称 */
};

static struct panel_resolution ili9881d_720p_video_panel_res = {
1366, /* panel_width /
768, /
panel_height /
70, /
hfront_porch /
70, /
hback_porch /
10, /
vfront_porch /
10, /
vback_porch /
2, /
vpulse_width */

static struct lane_configuration ili9881d_720p_video_lane_config = {
4, 0, 1, 1, 1, 1, 1(最后一个1代表高速模式)

static const uint32_t ili9881d_720p_video_timings[] = {
0xf3, 0x3a, 0x26, 0x00, 0x6a, 0x6e, 0x2c, 0x3E, 0x2f, 0x03, 0x04, 0x00
//该timing值数组代表lcd的时序,可根据高通的一个表格计算得到;

static struct panel_timing ili9881d_720p_video_timing_info = {
0, /* dsi_mdp_trigger /
4, /
dsi_dma_trigger /
0x0a, /
tclk_post /data由hs->lp,hs clk需要继续发送byteclk周期个数;
0x1D /
tclk_pre */data由lp->hs,hs clock需要hold住的byteclk周期个数;
//主要修改post和pre的值,根据高通的表格计算可以得到。

将lt8911exb驱动文件修改为普通的执行文件,将其添加在bootable/bootloader/lk/target/msm8953/目录下,使其在lk阶段生效,可以显示开机logo等kernel启动前的显示内容。这样就不用将主屏转接芯片驱动添加到内核中了。

相关配置如下:
/bootable/bootloader/lk/include/target.h
@@ -121,4 +121,5 @@ bool target_battery_is_present();
uint32_t target_get_pmic();
int target_update_cmdline(char *cmdline);
int target_get_vb_version();
void lt8911exb_config(void);//声明驱动的入口函数

将mipi输出强制改成高速,调试过程中发现,不改会影响副屏显示。

配置背光引脚:

pin_source表示GPIO源,如果是pmic上的引脚则pm8941_gpios,cpu上的引脚是msmgpio。

配置屏的数据,使屏在boot阶段启动:
/bootable/bootloader/lk/target/msm8953/oem_panel.c


static int init_panel_data():

int oem_panel_select():

lk阶段配置可参考patch:包含i2c总线的配置,时钟的配置。
Kernel阶段配置:
1.添加屏参数的dtsi,并将屏参数dtsi复制到该路径下:
arch/arm64/boot/dts/qcom/msm8953-mdss-panels.dtsi

2.根据屏的规格书修改相关参数;
主屏:arch/arm64/boot/dts/qcom/dsi-panel-ili9881d-720p-video.dtsi:
&mdss_mdp {
dsi_ili9881d_720p_video: qcom,mdss_dsi_ili9881d_720p_video {
qcom,mdss-dsi-panel-name = “ili9881d 720p video mode dsi panel”;
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;//面板控制器,对mdss-dsi0的配置在msm8953-mdss.dtsi
qcom,mdss-dsi-panel-type = “dsi_video_mode”;//设置屏为video模式
qcom,mdss-dsi-panel-destination = “display_1”;//指定目标面板
qcom,mdss-dsi-panel-framerate = <60>;//帧率刷新60Hz(VSYNC)
qcom,mdss-dsi-virtual-channel-id = <0>;//虚拟通道标识,0为默认值
qcom,mdss-dsi-stream = <0>;//指定使用的数据包流,0:默认值
qcom,mdss-dsi-panel-width = <1366>;//宽度像素
qcom,mdss-dsi-panel-height = <768>;//高度像素
qcom,mdss-dsi-h-front-porch = <70>;//水平前肩:VDEN到HSYNC之间的vclk的个数
qcom,mdss-dsi-h-back-porch = <70>;//水平后肩:HSYNC到VDEN的vclk的个数
qcom,mdss-dsi-h-pulse-width = <20>;//HSYNC的脉冲宽度,单位是行数;
qcom,mdss-dsi-h-sync-skew = <0>;//水平同步偏移值
qcom,mdss-dsi-v-back-porch = <10>;//垂直后肩:VYSNC开始后到VDEN使能之间的行数
qcom,mdss-dsi-v-front-porch = <10>;//垂直前肩:VDEN结束后到VYSNC之间的行数
qcom,mdss-dsi-v-pulse-width = <2>;//VYSNC的脉冲宽度,单位是行数
qcom,mdss-dsi-h-left-border = <0>;//水平左边框值,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>;//像素深度,RGB888
qcom,mdss-dsi-color-order = “rgb_swap_rgb”;//msm rgb->panel rgb通道顺序对应
qcom,mdss-dsi-underflow-color = <0xff>;
qcom,mdss-dsi-border-color = <0>;
qcom,mdss-dsi-on-command = [ //面板的初始化指令
05 01 00 00 78 00 02 11 00 //0x11:sleep out
05 01 00 00 14 00 02 29 00]; //0x29:display on
qcom,mdss-dsi-off-command = [ //取消初始化指令
05 01 00 00 32 00 02 28 00
05 01 00 00 78 00 02 10 00];
qcom,mdss-dsi-on-command-state = “dsi_lp_mode”;//发送初始化指令后的状态为LP (low power)模式
qcom,mdss-dsi-off-command-state = “dsi_hs_mode”;//取消command模式后状态设置为HS高速模式
qcom,mdss-dsi-h-sync-pulse = <1>;//水平同步脉冲,决定硬件是否在垂直消隐期间发送水平同步脉冲;
qcom,mdss-dsi-traffic-mode = “burst_mode”;// non burst with sync pulses
//”non burst with sync start event”
qcom,mdss-dsi-lane-map = “lane_map_0123”;
qcom,mdss-dsi-bllp-eof-power-mode;
qcom,mdss-dsi-bllp-power-mode;
qcom,mdss-dsi-lane-0-state;
qcom,mdss-dsi-lane-1-state;
qcom,mdss-dsi-lane-2-state;
qcom,mdss-dsi-lane-3-state;
qcom,mdss-dsi-force-clock-lane-hs;//强制将DSI置于高速模式
qcom,mdss-dsi-always-on;
qcom,mdss-dsi-panel-timings = [7A 1A 12 00 3E 42 16 1E 14 03 04 00];//LCD的时序值,可以通过高通的表格计算得到。
qcom,mdss-dsi-t-clk-post = <0x0a>;//data由hs->lp,hs clk需要继续发送byteclk周期个数;
qcom,mdss-dsi-t-clk-pre = <0x1D>;//data由lp->hs,hs clock需要hold住的byteclk周期个数;
qcom,mdss-dsi-bl-min-level = <1>;//最小背光值
qcom,mdss-dsi-bl-max-level = <4095>;
qcom,mdss-dsi-dma-trigger = “trigger_sw”;//通过软件触发DMA;
qcom,mdss-dsi-mdp-trigger = “none”;//
qcom,mdss-dsi-bl-pmic-control-type = “bl_ctrl_wled”;//通过wled控制背光
qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 120>;
qcom,mdss-dsi-post-init-delay = <4>;
qcom,mdss-pan-physical-width-dimension = <59>;
qcom,mdss-pan-physical-height-dimension = <104>;
};
};

//参数含义可参考documentation/devicetree/bindings/drm/msm/mdss-dsi-panel.txt

副屏:arch/arm64/boot/dts/qcom/dsi-panel-ili9881d-720p-dsi1-video.dtsi:
(可以直接copy主屏的该文件进行修改),除了修改LCD对应的参数外,还需:
屏蔽掉:
//qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; qcom,mdss-dsi-panel-type = “dsi_video_mode”;//设置屏为video模式
//qcom,mdss-dsi-panel-destination = “display_1”;

3.更改主副屏其他参数:
arch/arm64/boot/dts/qcom/msm8953-nopmi-panel-camera.dtsi

&mdss_dsi { //修改为双通道dsi
hw-config = “dual_dsi”; //“dual_dsi”; //“single_dsi”;
};

&mdss_dsi0 {
qcom,dsi-pref-prim-pan = <&dsi_ili9881d_720p_video>;
pinctrl-names = “mdss_default”, “mdss_sleep”;
pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
//qcom,platform-te-gpio = <&tlmm 24 0>;//未使用
//qcom,platform-reset-gpio = <&tlmm 61 0>;
qcom,platform-bklight-en-gpio = <&tlmm 23 0>;//修改背光脚
};

&mdss_dsi1 {
status = “ok”;
qcom,dsi-pref-prim-pan = <&dsi_ili9881d_720p_dsi1_video>;
pinctrl-names = “mdss_default”, “mdss_sleep”;
pinctrl-0 = <&mdss_dsi1_active &mdss_te1_active>;
pinctrl-1 = <&mdss_dsi1_suspend &mdss_te1_suspend>;//没有使用TE,所以不用更改*.pinctrl.dtsi的相应配置
qcom,bridge-index = <0>;//dba的配置
qcom,pluggable;//dba的配置
//qcom,platform-te-gpio = <&tlmm 25 0>;
//qcom,platform-reset-gpio = <&tlmm 87 0>;
//qcom,platform-bklight-en-gpio = <&tlmm 40 0>;
};
//mdss_dsi,mdss_dsi0,mdss_dsi1定义在msm8953-mdss.dtsi中。

&dsi_ili9881d_720p_video {
qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
qcom,mdss-dsi-bl-pmic-control-type = “bl_ctrl_pwm”;//更改背光通过PWM控制
qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>;
qcom,mdss-dsi-bl-pmic-bank-select = <0>;
qcom,mdss-dsi-pwm-gpio = <&pm8953_mpps 4 0>;
};

&dsi_ili9881d_720p_dsi1_video {
qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
qcom,dba-panel;//dba的配置
qcom,bridge-name = “dsi1-bridge”;
};
//dba:(display bridge abstract),显示桥抽象层。作用是检测有其他桥接芯片连接,并将其事件发送HAL层处理。
在kernel中,drivers/video/fbdev/msm/mdss_dsi.c中,probe函数对dba有相应的创建工作队列和初始化操作:

可参考:https://blog.csdn.net/xishuang_gongzi/article/details/78076752

4.将mipi输出强制改为高速模式,不然影响副屏点亮。

5.drivers/video/fbdev/msm/mdss_dba_utils.c内定义宏:

该宏设置的对应timing参数在include/uap/video/msm_hdmi_modes.h中:

将屏相应参数补充到数组中,此处的参数会替代lk中lk/dev/gcdb/display/include里面相应的.h文件里面的参数。因此副屏并不需要在lk中添加.h文件。

四、调试
make bootimage ; make aboot; make dtboimage ;编译烧录后:
1.首先确认iic驱动挂载成功,屏添加成功:
cat proc/cmdline

2.先看背光,主副屏背光不亮:使用万用表测模块GPIO口的电压输出,如果没有电压,需要检查软件配置:
(1)arch/arm64/boot/dts/qcom/msm8953-nopmi-panel-camera.dtsi;
(2)/bootable/bootloader/lk/target/msm8953/target_display.c ;
(3)副屏背光配置在副屏的转接芯片驱动中;
软件配置正确,gpio有1.8v输出电压,然后测插口基座处有3.3v电压,此时背光就点亮了,如果还是不亮,就换一块屏幕或者请硬件工程师协助分析;

3.背光点亮后,LCD屏没有显示,分析:
(1)模组没有输出mipi信号(检查相关的软件配置)、示波器测mipi信号。
(2)LCD相关的时序timing值,平台mipi的timing等参数配置不正确;
(3)转接芯片IC的驱动对LCD的相关配置:屏支持的line数,通道速率;色深;video模式等;以及相应的寄存器配置问题,可以找供应商协助;
(4)对比硬件图测量屏接口基座的电压值,各个pin针的电压是否正确;
(5)确认硬件没有问题,转接芯片寄存器没有问题之后,还是不亮,就需要多检查软件配置。

其他参考:
https://www.lcdfans.com/582.html
https://blog.csdn.net/liwei16611/category_6263565.html

Video模式和command模式:
Command:需要IC自带GRAM,在mipi四条data line中,只能使用line0,且在LP模式,通过ACK和error与Host通信;
Video模式:不需要GRAM,要通过四通道不断给panel刷数据,

高通Android9设置双屏同显示相关推荐

  1. 高通平台android7.1系统显示旋转180度

    实现方法 内核层修改 kernel\msm-3.18\arch\arm\boot\dts\qcom\dsi-panel-lm215w-lvds-1080p-video.dtsi增加qcom,mdss- ...

  2. 高通android9 lanucher3

    ls Launcher3/res/xml/显示内容如下 backupscheme.xml    default_workspace_3x3.xml  default_workspace_5x5.xml ...

  3. 高通平台android kernel 开机logo显示和传统linux一样

     由于高通8k平台lk下只有2s多点 故直接在kernel显示logo,这篇文章转载过来制作linux logo,其实这个当时学习就会,只不过忘记了.在这里重提一下ubuntu下的GIMP图片工具 ...

  4. 高通平台android kernel 开机logo显示和传统linux一样 .

    由于高通8k平台lk下只有2s多点 故直接在kernel显示logo,这篇文章转载过来制作linux logo,其实这个当时学习就会,只不过忘记了.在这里重提一下ubuntu下的GIMP图片工具真的很 ...

  5. 高通快速调试命令集合---持续更新

    scp拷贝文件 scp -P xxxx -r chenqw@xxx.xxx.xxx.xxx:/home/zhangx/.ssh/chenqw@ubuntu208.pub . 高通Android9.0查 ...

  6. 处理器博通还是高通比较好_苹果手机基带高通还是Intel好?iPhone查看基带生产商厂家方法...

    众所周知,从 iPhone7 - iPhone X系列的苹果手机均采用高通和英特尔基带混用,而从大多数果粉用户反馈来看,高通基带产品,信号表现似乎更好一些.究竟,苹果手机基带高通还是Intel好?如何 ...

  7. 苹果xsmax有高通基带吗_“爱情”走得太快:苹果或在2023年与高通正式“分手”|高通|英特尔|手机|基带...

    随着iPhone 12手机的发布,关于这款手机的拆解视频也变得越来越多,根据相关的拆解报告显示,苹果在iPhone 12 手机上采用了来自高通的X55基带,而X55基带同时也是今年大部分安卓旗舰手机采 ...

  8. 净利增速达485%,高通是条真“骁龙”?

    美国东部时间11月4日美股盘后,高通发布了2020财年第四季度的财务报告.财报数据显示营收.净利均实现不错的涨势,这也刺激高通盘后股价上涨近13%.截止美股研究社发稿,高通每股报128.97美元,总市 ...

  9. Android10 高通平台 softap热点基本流程2

    上一篇讲到SoftApManager.IdleState状态中处理CMD_START消息,这个消息用来打开热点功能.我们从这里继续看热点功能基本流程. public boolean processMe ...

最新文章

  1. 【CV】基于OpenCV的手掌检测和手指计数
  2. 使用Android应用调用WebService实现天气预报
  3. 关于网站地址解析到65.49.2.178的问题和解决方法
  4. request.cookie[name]的到的过期时间是{0001-1-1 0:00:00}
  5. 【实习】同方威视南京研发中心招聘图像算法工程师
  6. 奋战杭电ACM(DAY10)1015
  7. 基于递归的前序二叉树遍历实现
  8. 不属于计算机主机设备的是什么,以下不属于外部设备的是( )。 A.输入设备 B.中央处理器和主存储器 C.输出设备 D.外存储器...
  9. 2021-2027全球与中国乳胶机械稳定性测试仪市场现状及未来发展趋势
  10. android系统经纬度,android系统获取经纬度总是0值,求解决
  11. 大学这么多比赛,我该参加哪个?
  12. 如何使用计算机创电子表格,计算机如何创建表格?
  13. 更新Windows11出现错误0x80240022的解决方法
  14. 【图像分割】基于迭代阙值选择、最大类间差、区域生长多种算法实现图像分割含Matlab源码
  15. hive sql 向上取整、向下取整、保留小数位的函数
  16. windows文本转语音调用
  17. Qt中qrc文件编译后缺少预编译头文件
  18. python安装pyinotify模块
  19. verilog数字系统设计——串入并出移位寄存器
  20. 关于近视眼手术网友的评价

热门文章

  1. linux 内核驱动中对文件的读写
  2. 群签名和Go语言实现细节(BBS04--Short Group Signatures)
  3. 计算机学院可以举办活动,计算机学院举办2019年家长开放日系列活动
  4. (47)【漏洞发现】漏扫工具合集、WAF绕过分类
  5. 二进制与十进制的换算
  6. 标定学习笔记(九)-- 利用空间正交约束的相机自标定和三维重建
  7. 三步教你安装微软系统,使用uiso制作U盘启动盘
  8. 苹果手机软件升级密码_苹果app应用制作多少钱_广腾(深圳)互联网科技有限公司...
  9. 从零开始入门创作游戏——2D沙盘类随机地图的生成
  10. 双人零和博弈(two player zero-sum game)的性质