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调试的主要内容,如果未能解决你的问题,请参考以下文章