QCOM LCD调试

Posted bobuddy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QCOM LCD调试相关的知识,希望对你有一定的参考价值。

LCD DSI协议
DSI 协议中 ,0x29 和 0x39 区别:在 Mipi 协议中,它俩都表示 长包(Long Packet)数据类型.
Mipi DSI 的 Spec 中写着两者的区别: 0x29 属于 Generic long write ,0x39 属于 DCS long write.

DCS 系的读写命令,可带参数,常用于 LCD 初始化参数命令.
Generic 系读写命令,是协议规范外的命令,通常是一些 IC 定制的,只要确保主机和外设同意这些数据格式即可,通常和 DCS 通用.

各种 clk 及其计算方式
DSI vdo mode下的数据速率data_rate的大致计算公式为:
  [Bitclk]Data rate= (Height+VSA+VBP+VFP) * (Width+HSA+HBP+HFP) * total_bit_per_pixel * frame_per_second / total_lane_num
  total_bit_per_pixel[bit per pixel]:如 RGB888,24bit; RGB666,18bit  
  frame_per_second: 一秒钟多少帧
  total_lane_num: 使用几路 lane 传输数据

以下面的LCD举例:

720P: 1280*720 4lane
    <PanelWidth>720</PanelWidth>
    <PanelHeight>1280</PanelHeight>
    <HFrontPorch>100</HFrontPorch>
    <HBackPorch>100</HBackPorch>
    <HPulseWidth>33</HPulseWidth>
    <HSyncSkew>0</HSyncSkew>
    <VBackPorch>30</VBackPorch>
    <VFrontPorch>20</VFrontPorch>
    <VPulseWidth>2</VPulseWidth>
    <PanelFrameRate>60</PanelFrameRate>
H-total = HorizontalActive + HorizontalFrontPorch + HorizontalBackPorch + HorizontalSyncPulse + HorizontalSyncSkew

// 1280 + 100 + 100 + 33 + 0 = 1513

V-total = VerticalActive + VerticalFrontPorch + VerticalBackPorch + VerticalSyncPulse + VerticalSyncSkew

// 720 + 20 + 30 + 2 = 772

Total pixel = H-total * V-total * 60(Hz通常都是这个,当然可以变).

// 1513 * 772 * 60 = 65,361,600

Bitclk = Total pixel * bpp(byte) *8/lane number(有几路mipi data lane).

// 65,361,600 * 3 * 8/4 = 392,169,600

Byteclk = bitclk/8

// 392,169,600/8 = 49,021,200

Dsipclk(Dsi pixel clock) = (Byteclk * lane number)/bpp(byte) = Total pixel * 8

// 49,021,200 * 4 / 3 = 65,361,600

LCD 查看LCD 分辨率和DPI(像素密度,每英寸像素点个数)
  adb root
  adb shell
  wm size             //查看分辨率
  wm density        //查看DPI
  wm size reset     //恢复初始值
  wm density reset  //恢复初始值

PPI 和 DPI
1. dpi是dot per inch,每英寸多少点,ppi是 Pixel per    inch,每英寸像素数,针对显示器的设计时,
  dpi=ppi。ppi计算方法是长宽各自平方之和开方,除以对角线长度(单位英寸)。原理可以自己画个矩形勾股定理算一算。
2. ppi表示显示设备的点密度,dpi表示印刷品点密度。
3. dip或dp,是安卓开发用的单位,1dp表示在屏幕点密度为160ppi时1px长度。因为安卓设备屏幕众多不可能为每个屏幕单独开发,所以用公式
 px=dp*(ppi/160)计算在不同屏幕上的像素数。举例:HVGA屏320*480,一般是3.5寸,计算点密度为
 √ (320^2 + 480^2) / 3.5 = 164,约等于160,1pd=1pxWVGA屏480*800,按3.8寸屏算,点密度 √ (480^2 + 800^2) / 3.8 = 245,
 约等于240,1dp=1.5px。还有更高分辨率的屏幕就不一一列举了,总之dp是为了方便适配不同屏幕的单位,在不同屏幕密度下,1dp的物理长度也相同。

链接:https://www.zhihu.com/question/21220154/answer/18584739

修改方式;
diff --git a/device/xxx/xxx/system.prop b/device/pri_name/system.prop
+# set lcd density
+ro.sf.lcd_density=180

ADB 查看当前LCD的name -- Sl8521E
  adb root
  adb remount
  cd /sys/devices/platform/sprd-panel-if/display/panel0
  cat name

ADB 查看开机动画
  adb shell setprop ctl.start bootanim

SC9820E ADB 设置背光等级 
 adb root
 adb shell
 cd sys/class/backlight/sprd_backlight # echo 50 > brightness 
 //直接设置方法 
 adb shell settings put system screen_brightness 150 
 //获取休眠时间 
 adb shell settings get system screen_off_timeout 

ADB 调整LCD前后肩 // 展锐SL8521E
  adb root
  adb shell
  cd sys/devices/platform/sprd-panel-if/display/panel0
  cat vporch
  cat hporch
  echo 80 54 8 > hporch // 调整后,需要息屏,然后再次唤醒才会生效
  echo 12 16 2 > vporch // 调整后,需要息屏,然后再次唤醒才会生效

ADB 截屏命令
  adb root
  adb wait-for-device
  adb shell screencap -p /data/screen.png
  adb pull /data/screen.png

ADB 录屏
  adb shell screenrecord  --time-limit 10 /sdcard/demo.mp4

# ADB 查看 fb0节点上的数据 // 相当于截屏
  将fb0中的数据以图片方式保存到内存卡的根目录,图片名称为 fb0.png
  adb shell screencap -d /dev/graphics/fb0 sdcard/fb0.png

# ADB查看lcd信息 包含mipi-on off 等命令
【 高通平台 android 9.0】

  sys/kernel/debug/mdss_panel_fb0/intf0/
  cd dsi_ctrl_pdata  // 一些初始化数据可以在里面查看
  cd lcdc                  // 查看 lcd 前后肩的值

KEY Android 5.1 使用 KEY_F1 按键,上层收不到键值
【软件配置问题】涉及到多个文件:
    设备树配置:xxx_msm8909-pinctrl.dtsi  xxx_msm8909-qrd.dtsi 这两个文件使用的KEY相关配置要正确

    key_F1
        label = "key_f1";
        gpios = <&msm_gpio 95 0x1>;
        linux,input-type = <1>;
        linux,code = <59>;
        debounce-interval = <15>;
      ;
 
  tlmm_gpio_key
        qcom,pins = <&gp 90>, <&gp 91>, <&gp 92>, <&gp 95>;
        qcom,pin-func = <0>;
        qcom,num-grp-pins = <4>;
        label = "tlmm_gpio_key";
        gpio_key_active: gpio_key_active
          drive-strength = <2>;
          bias-pull-up;
        ;
        gpio_key_suspend: gpio_key_suspend
          drive-strength = <2>;
          bias-disable;
        ;
      ;
  device\\xxx\\gpio-keys.kl  修改此文件,增加自己使用的KEY_F1 按键的映射.

  key 59  F1
  key 60  F2
  key 61  F3
  key 62  F4

  kernel\\include\\uapi\\linux\\input.h 在此文件中,有所有可用按键的键值定义.在读到设备树定义的键值后, 会将键值转化为按键名字进行上传.当然上传后,JNI层会对键值进行另一次转化,转化为上层的键值.
  上层键值的文件 frameworks\\base\\core\\java\\android\\view\\KeyEvent.java
  adb logcat –v time –b main –b system > d:/log.log  (这个抓log不会停,会一直抓)
  然后按下按键,搜索 interceptKeyTq 如果上报成功会收到转化后的键值.
  必须打开这几项debug开关才能在上层抓到log.

key_code // android9 驱动键值定义
8953_APP_P\\kernel\\msm-4.9\\include\\uapi\\linux\\input-event-codes.h 

# LOG // user 版本抓所有log
  adb bugreport > bugreport.log 这个命令抓,读完缓存会自动停止
  ------ KERNEL LOG (dmesg) ------ // kernel log 开始的标记

# LOG kernel log 节点
  dmesg 是一个 可执行程序,去读的 /proc/kmsg(这是个节点)

# LOG 展讯平台 framework crash 抓slog
  slog log
  adb pull /data/slog .
  /data/misc/hprofs/下的hprof文件
  adb pull /data/misc/hprofs .
  出现死机 如果还有adb端口 就直接使用命令  如果没有adb端口 那就重启之后再执行

  抓取上层log: adb logcat -b main -b radio -b system -v time
  // 不使用ctrl+c结束,会一直抓log

DUMP MSM8953 解 【kernel dump】
  1. 机器死机后,拔掉usb,防止usb再次唤醒重启
  2. 打开 QPST software Download 软件,插上USB, 在 SB3.0 上,打开Browse,可以看到dump 已经开始抓取
  3. C:\\ProgramData\\Qualcomm\\QPST\\Sahara // 这是生成的dumo文件路径,找到刚刚抓取的文件
  4. 找到 out\\target\\product\\prj_name\\obj\\KERNEL_OBJ\\vmlinux 文件,拷出来放在一个文件中
  5. 打开 dump 网站 https://cap.qti.qualcomm.com/default.aspx 或者 桌面的 QCAP 软件
  6. 登陆解dump 网站或工具,选择对应的 平台(msm953),AP(kernel当然在ap侧)
  7. 选取刚刚的 抓取到的dump文件和 vmlinux,开始解析dump
  8. 点击 Summary,查看原因.
  例: 空指针导致kernel死机
  APPS Crash - Page fault Execute error: PC = pinctrl_select_state+0x1c/0x50 LR = adv7533_probe

注:Log Location:C:\\ProgramData\\Qualcomm\\QPST\\Sahara\\Port_COM611        // QPST software Download 抓到的死机文件
注:下面子选项选择 APPS,然后文件选择prj_name\\dump  // vmlinux 文件

# 抓dump步骤 -- 必须用IE浏览器
  1. 死机后,打开QPST config 软件,等待抓dump结束,900E消失为止
  2. dump 在如下路径,C:\\ProgramData\\Qualcomm\\QPST\\Sahara\\
  3. 在编译的代码路径中,找到 vmlinux(kernel 的elf文件,其他部分请找对应的elf文件)

模拟系统进入 dump 状态
【(dump功能需要是开的,一般版本dump都是关掉的)】

 adb shell
 echo c > /proc/sysrq-trigger
 adb shell "echo c > /proc/sysrq-trigger"

查看是否打开了 dump 功能
adb shell "cat /sys/module/msm_poweroff/parameters/download_mode"

设置打开dump功能
adb shell "echo 1 > /sys/module/msm_poweroff/parameters/download_mode"

LOG 追踪打印函数调用关系
  dump_stack(); // 打印函数调用关系

LCD 显示方向 (修改 memory 扫描方向)
  一般修改 0x36 寄存器,详细修改请参考具体 datasheet

KEY SL8521E 按键键指表
  frameworks/native/include/android/keycodes.h
  adb shell input keyevent 26 // Power  按键   26 的值就是取自这里
  adb shell input keyevent 23 // center 按键
  adb shell input keyevent 17 // * 键
  adb shell input keyevent 18 // # 键


  kernel keycode 键值定义表
  kernel\\include\\uapi\\linux\\input-event-codes.h

SL8521E 解锁
  adb shell input keyevent 23  // center 按键
  adb shell input keyevent 17  // # 键

# LCD 判断像素位数
  // 看 lcd 规格书
  Color Depth  16.7M
  2^24 = 16777216 约等于16.7M 即每个像素是24bit RGB888

ADB 查看 android 版本号
  adb shell getprop ro.build.version.release
  8.1.0

# LED // Android9 MSM8953
1.打开闪光灯

  adb shell
  cd sys/class/leds
  cd led:flash_0
  echo 255 > brightness // 执行之前 brightness 要为 0
  cd ../led:switch_0
  echo 255 > brightness // 执行之前 brightness 要为 0
  // 执行完这句就闪烁了,闪烁一下

2. 打开照明灯

  adb shell
  cd sys/class/leds
  cd led:torch_0
  echo 255 > brightness // 执行之前 brightness 要为 0
  cd ../led:switch_0
  echo 255 > brightness // 执行之前 brightness 要为 0
  // 执行完这句就亮了,长亮

开机动画修改(Android 字样的开机动画)
  换一下图片就好
  frameworks\\base\\core\\res\\assets\\images\\android-logo-mask.png

ADB SElinux // adb 查看 selinux 是否打开
  adb shell getenforce // adb 查看 selinux状态
  Enforcing  // 标明当前是打开的
  Permissive // 标明当前是关闭的

  adb shell setenforce 0 // adb 关闭 selinux
  adb shell setenforce 1 // adb 打开 selinux

ADB android 如何判断手机CPU是32位还是64位的?
 adb shell getprop ro.product.cpu.abi
 arm64-v8a

PMIC-bootreason
[msm8909、Android8.1]

//adb方式获取启动原因
adb shell
cd /d/spmi/spmi-0/
echo 0x808 > address
echo 0x1 > count
cat data

内核API接口
kernel/drivers/platform/msm/qpnp-power-on.c
static int qpnp_pon_probe(struct spmi_device *spmi)
...
/* PON reason */
rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, QPNP_PON_REASON1(pon->base), &pon_sts, 1);
...


原文链接:https://blog.csdn.net/FANG_YISHAO/article/details/120654883

以上是关于QCOM LCD调试的主要内容,如果未能解决你的问题,请参考以下文章

Android Qcom lcd display 学习

Android Qcom lcd display 学习

Android Qcom LCD display 学习

Android Qcom lcd display 学习

Linux MIPI DSI驱动调试笔记-LCD时序参数配置

修改系统dpi