LCD 调试技巧 01
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相关推荐
- 谷歌浏览器前端调试技巧01——使用F12清除缓存
对于搞前端开发的人来说,前端调试是不可避免的,使用谷歌浏览器调试更是必备手段,今天主要是给大家分享一下清楚缓存的技巧.已经了解的朋友请移步. 为什么需要清理浏览器缓存? 我们通常说的WEB应用采用BS ...
- 高通平台 Sensor 调试技巧 01
MSM8953 查看 modem 的版本号 8953_MODEM_P\MPSS.TA.3.0\modem_proc\build\ms\XXX_CUSTOM\xxxcust_prj.h #defin ...
- 反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......
反调试技巧总结-原理和实现 -------------------------------------------------------------------------------------- ...
- VC++调试技巧学习总结
VC6.0调试方法 有时候,我们编写好一个程序后,希望通过调试来知道变量值的变化情况,下面我和大家分享一下怎么利用VC6.0来查看变量值变化情况. 工具/原料 VC6.0软件.待测试程序 方法/步骤 ...
- lldb常用命令与调试技巧
一.基本介绍 LLDB是个开源的内置于XCode的调试工具,它能帮助我们在开发中更快的定位和调试bug,无论正向和逆向开发中都有很大的作用.lldb对于命令的简称,是头部匹配方式,只要不混淆(不提示歧 ...
- [转] Xcode 高级调试技巧
在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令 调试本地文件方法(Mac OS X):(lldb) target create "/Users/piaoy ...
- Xcode高级调试技巧(1)
在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令 调试本地文件方法(Mac OS X):(lldb) target create "/Users/piaoy ...
- NE问题分析方法 ---- Native栈还原和调试技巧
文章目录 简介 Native栈还原 调试技巧 简介 NE即Native Exception,我们主要指Android C/C++程序出现异常报错,因Camera HAL是由C/C++实现的,在相机系统 ...
- 代码调试技巧小集合(雨中飞燕出品)
// ************************************************************ // // 本文源自飞燕之家在线测评论坛http://yzfy.org/ ...
最新文章
- 8大领域、6大机遇!读懂2020年AI医疗新风向
- xp下msn8.5无法安装的解决办法
- Spring拓展接口之FactoryBean
- 腾讯被深圳南山法院强制执行:执行标的25元;B站就招聘争议致歉;华为云回应是否将独立运作|极客头条...
- webpack4+vue打包简单入门
- CustomViewWith_Image_Text_Video
- 教育部 计算机类专业代码,全国本科专业代码查询
- [论文总结] 深度学习在农业领域应用论文笔记8
- 【导数术】12.极值点偏移与拐点偏移
- 迁移学习 transfer learning
- dirname 使用总结
- vue返回上一页面时记忆回到原先滚动的位置
- 文献管理软件 Endnote 简易上手
- Java中的时区转换
- 【java】java编写 if 时不带 else
- 网关是什么,一文带你快速入门腾讯技术工程
- 微信小程序计算圆周长和面积
- 计算机合成的音乐后缀,计算机音乐课程――《声音制作与合成基础》
- 计算机鼠标不灵活怎么办,鼠标右键不灵敏怎么办?快速解决方法(1分钟解决)...
- “魔方阵“c语言实现,奇数型
热门文章
- 『老叶茶馆』2021年度热文推荐
- 计算机主板扩展槽,主板上这多扩展插槽,都是干什么用的,看了不后悔
- ImagePullBackOff: Back-off pulling image \gcr.io/google_containers/pause-amd64:3.0 解决方法
- Cent OS安装中文字体
- JVM垃圾清理机制详解 ✨ 每日积累
- of介词短语作定语_OF介词短语在商务英语中的翻译策略
- GPS手机射频的一些测试项目
- QT开发中常用的快捷键(Windows+QT)
- VMware Ubuntu18.04与WIN7共享目录
- 安卓调用手机自带的浏览器