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);
...}

露将凝 秋渐浓

LCD 调试技巧 01相关推荐

  1. 谷歌浏览器前端调试技巧01——使用F12清除缓存

    对于搞前端开发的人来说,前端调试是不可避免的,使用谷歌浏览器调试更是必备手段,今天主要是给大家分享一下清楚缓存的技巧.已经了解的朋友请移步. 为什么需要清理浏览器缓存? 我们通常说的WEB应用采用BS ...

  2. 高通平台 Sensor 调试技巧 01

    MSM8953 查看 modem 的版本号 8953_MODEM_P\MPSS.TA.3.0\modem_proc\build\ms\XXX_CUSTOM\xxxcust_prj.h   #defin ...

  3. 反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......

    反调试技巧总结-原理和实现 -------------------------------------------------------------------------------------- ...

  4. VC++调试技巧学习总结

    VC6.0调试方法 有时候,我们编写好一个程序后,希望通过调试来知道变量值的变化情况,下面我和大家分享一下怎么利用VC6.0来查看变量值变化情况. 工具/原料 VC6.0软件.待测试程序 方法/步骤 ...

  5. lldb常用命令与调试技巧

    一.基本介绍 LLDB是个开源的内置于XCode的调试工具,它能帮助我们在开发中更快的定位和调试bug,无论正向和逆向开发中都有很大的作用.lldb对于命令的简称,是头部匹配方式,只要不混淆(不提示歧 ...

  6. [转] Xcode 高级调试技巧

    在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令 调试本地文件方法(Mac OS X):(lldb) target create "/Users/piaoy ...

  7. Xcode高级调试技巧(1)

    在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令 调试本地文件方法(Mac OS X):(lldb) target create "/Users/piaoy ...

  8. NE问题分析方法 ---- Native栈还原和调试技巧

    文章目录 简介 Native栈还原 调试技巧 简介 NE即Native Exception,我们主要指Android C/C++程序出现异常报错,因Camera HAL是由C/C++实现的,在相机系统 ...

  9. 代码调试技巧小集合(雨中飞燕出品)

    // ************************************************************ // // 本文源自飞燕之家在线测评论坛http://yzfy.org/ ...

最新文章

  1. 8大领域、6大机遇!读懂2020年AI医疗新风向
  2. xp下msn8.5无法安装的解决办法
  3. Spring拓展接口之FactoryBean
  4. 腾讯被深圳南山法院强制执行:执行标的25元;B站就招聘争议致歉;华为云回应是否将独立运作|极客头条...
  5. webpack4+vue打包简单入门
  6. CustomViewWith_Image_Text_Video
  7. 教育部 计算机类专业代码,全国本科专业代码查询
  8. [论文总结] 深度学习在农业领域应用论文笔记8
  9. 【导数术】12.极值点偏移与拐点偏移
  10. 迁移学习 transfer learning
  11. dirname 使用总结
  12. vue返回上一页面时记忆回到原先滚动的位置
  13. 文献管理软件 Endnote 简易上手
  14. Java中的时区转换
  15. 【java】java编写 if 时不带 else
  16. 网关是什么,一文带你快速入门腾讯技术工程
  17. 微信小程序计算圆周长和面积
  18. 计算机合成的音乐后缀,计算机音乐课程――《声音制作与合成基础》
  19. 计算机鼠标不灵活怎么办,鼠标右键不灵敏怎么办?快速解决方法(1分钟解决)...
  20. “魔方阵“c语言实现,奇数型

热门文章

  1. 『老叶茶馆』2021年度热文推荐
  2. 计算机主板扩展槽,主板上这多扩展插槽,都是干什么用的,看了不后悔
  3. ImagePullBackOff: Back-off pulling image \gcr.io/google_containers/pause-amd64:3.0 解决方法
  4. Cent OS安装中文字体
  5. JVM垃圾清理机制详解 ✨ 每日积累
  6. of介词短语作定语_OF介词短语在商务英语中的翻译策略
  7. GPS手机射频的一些测试项目
  8. QT开发中常用的快捷键(Windows+QT)
  9. VMware Ubuntu18.04与WIN7共享目录
  10. 安卓调用手机自带的浏览器