勿刻舟求剑!

成长是螺旋式的,涉及到:深度(高度)和广度。

(是否掌握某方面的知识,掌握或不掌握的程度;是否愿意,愿意或不愿意的程度;两者之间的关系;黑与白,有过度中间有赤橙黄绿青蓝紫;)

目录:

1.  工作守则

2.  拉代码问题

3.  路径问题

4.   GPIO口,pin管脚,DTS ,DWS,设备树问题

5.  项目配置,编译问题

6.   log问题,  打印信息问题

7.  命令,快捷键或者指令

8.  关键字搜索, 标识位

9.  权限问题

10.   effuse,签名问题

11.  下载问题

12.  中断问题

13.  兼容问题

14.  工具问题  (source insight, gat,git bash,pads,vi)

15.   版本问题,版本号问题

16.   JIRA测试报问题分类

17.  代码提交问题  gerrit问题

18.  备忘录

-------------------------------------------------------------格式说明----------------------------------------------------------------

(1)大标题是.加两个空格;     (2)大标题可以直接搜索,内容若和大标题一致,要加空格分隔做为区分;

-------------------------------------------------------------旅行开始----------------------------------------------------------------

1.工作守则:

1).对于porting的驱动不能只是简单移植,而且要清楚驱动中都有哪些操作,尤其是使用的硬件资源务必一一检查,

GPIO控制引脚,中断引脚,上下电等都是需要检查的;

2). 大家发临时测试版本的时候,记得拷贝保存好out下的

Out/target/product/xxx/obj/ KERNEL_OBJ /vmlinux  文件,以免测试出kernel bug的时候方便分析。谢谢!

3).

2. 拉代码问题:

1). vi    kernel-3.18/.git/config查看

git clone +内核代码路 径,可以只拉内核

Repo sync +内核代码路 径 也可以只拉内核代码;

2). 拉代码的时候,要使用repo sync -c命令,这样可以节省很多空间,repo init的时候 后面可以跟 --depth=1/2/3等,数字越大,拉下来的空间越小,它会把一些git 提交都不包含在里面

 repo init -u ssh://192.168.10.48:29418/MTK_CODE/platform/manifest -b master -m O1_MP7_V1.57_OS4.X.xml --depth=1

3). 删除kernel后要先切换分支,然后再更新,这样才会更新;

更新分支:git  remote update

            4). 拉代码过程,SCM RELEASE邮件里会有的:repo init -u ssh://192.168.10.10/MTK6753_M_X520/manifest -b master -m X521-J5088-XUI-MP1.xml

然后,全部更新:repo sync               ;或者更新你想要的代码模块: vi   ./repo/mainxxx   ;找到你要拉取的kernel, repo sync   /**/kernel/

更新好了以后,在本地创建分支:repo start my_branch --all

最后是编译:

先运行source rlk_setenv.sh rlk_projects/  这时会出现c7/     .git/   it1520/(是下面要编译的项目)

全编译指令:source rlk_setenv.sh it1520;make -j32 2>&1 | tee log.txt

只编译bootimage,kernel指令:

source rlk_setenv.sh it1520;make kernel bootimage -j32 2>&1 | tee log.txt

make pl是编译preloader指令;

编译USR版本是:source rlk_setenv.sh it1520 user;

注意:红色字体为对应的项目名,每个项目不一样,是在项目的一级目录里执行命令。

拉的代码默认没有git工具这时如果要用的话就  git init

同时,zprojects配置文件在rlk_projects/it1520/kernel/下的debug文件里,这时还要在media下的Makefile里去搜索。

5).

3.路径问题:(更多节点目录在驱动与应用节点对应表里)

1). hall/hel层路径一: hardware/libhardware;

路径二:vendor;

2). AP和BP安卓7.0文件路径,用于META模式测试,

3). 权限文件:device/mediatek/common/sepolicy/basic/

4). 工厂模式代码路径:

Z:\mywork\WX4_H8013_HiOS2.0.0_N\vendor\mediatek\proprietary\factory\src\test

5). vmlinux所在的目录:mywork/x557/out/target/product/rlk6580_we_m/obj/KERNEL_OBJ/

6). 查看宏定义是否配置:

方法一:

vi  out/target/product/x680_h6116/obj/KERNEL_OBJ/include/generated/   autoconf.h

方法二:

Vi  out/target/product/x680_h6116/obj/KERNEL_OBJ/.config

7). 修改I2C速率kernel-3.18/drivers/misc/mediatek/i2c/mt6580/i2c.c

8). 在这个文件里可以找到键值被使用的情况:device/reallytek/rlk6753_65_n/mtk-kpd.kl

9). 查看TP和LCM的设备名字节点: proc/rlkdevinfo

查看TP固件版本号:/sys/devices/platform/mtk-tpd/

I2C设备里面是否已经成功添加TP设备:  /sys/bus/i2c/drivers/

10). 电池目录:kernel-4.9/drivers/power/supply/meditek/charger/

11). 输入子系统上层代码:路径:frameworks/base/core 和 java/android/view/KeyEvent.java

12).

4. GPIO,pin管脚,DTS ,DWS,设备树问题:

1).Dts和dws文件的优先级是DTS大于DWS,DTS会覆盖DWS,DWS文件配置的是GPIO口管脚的默认状态;

2). 查看dts.dws最后生成的文件

out/target/product/rlk6580_weg_n/obj/KERNEL_OBJ/arch/arm/boot/dts/cust.dtsi

3).查看pin管脚状态:

方法一:cat      /sys/devices/virtual/misc/mtgpio/pin | grep -rn " 10:"

cat /sys/class/misc/mtgpio/pin | grep -rn “ 10:”

方法二:查看pinctrl号:

/sys/bus/platform/devices/1000b000.pinctrl # cat mt_gpio

安卓P之后的路 径是:

/sys/bus/platform/drivers/mediatek-mt6761-pinctrl/1000b000.pinctrl/mt_gpio

4). 设备树的节点位置:

Cat  proc/device-tree/spi@11012000 (该设备是在平台端注册的)

​/proc/device-tree/touch   设备树

如下:@touch链接到了/proc/device-tree/touch 目录下,

如果是&spi2是链接到spi2目录下:

5). DWS配置

Dws中的上拉和下拉,pull en表示使能上拉或者下拉,是上拉或者下拉的总开关;inpull sellhigh勾上表示上拉,不勾表示下拉;

(注意:GPIO管脚不允许悬空,悬空的状态是自由状态。)

   

6). GPIO口操作方式:

第一种:kernel里面

pinctrl_lookup_state(pinctrl1, "default");获取dts设备树管脚;

pinctrl_select_state(pinctrl1, rst_output1);设置输出状态;

(注意:这个需要在dts里面配置管脚为pinctl方式)

Dts配置第二种方式:gpio口为63和4

第二种:

gpio_get_value(const struct gpio_desc *desc);

gpio_set_value(struct gpio_desc *desc, int value);

(该方式目前最为常用)

第三种:lk里面

#define GPIO_CTP_RST                (GPIO174 | 0x80000000)   管脚声明

mt_set_gpio_mode(GPIO_CTP_RST, GPIO_MODE_00);  设置gpio口模式

mt_set_gpio_dir(GPIO_CTP_RST, GPIO_DIR_OUT);

设置gpio口为输入或者输出管脚

mt_set_gpio_out(GPIO_CTP_RST, GPIO_OUT_ONE);   设置gpio口输出状态

第四种:

gpio_direction_outputport_num,0/1);

(这种比较老,现在基本上都用上面第二种;)

https://blog.csdn.net/shiyongyue/article/details/75103446     详细的 关系

linux驱动中常常会碰到gpio_set_valueport_num,0/1)或gpio_direction_output port_num,0/1) 这两者有什么关系呢gpio_set_valueport_num,0/1 一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了!而gpio_direction_output port_num,0/1),在某个GPIO口写上某个值之后,还会把这个端口设置为输出模式 因此,有人也许就会建议,把gpio_set_value这个函数直接去掉不用,是否可以,显然是可以的。 但是为什么系统还要用呢, 我个人分析是, 系统开发人员在要结合这两者来使用,以便提高效率。 一般某个端口设置好了输入与输出模式后,最好不要经常变动。 首先要调用gpio_direction_output(),以后要设置高低电平时,直接使用gpio_set_value()就可以了,这样可以省却再 次调用设置输出模式的操作,从而提高运行效率)。

7).

5.项目配置,编译问题:

1). 在projects下的配置文件里  FT3X27和=y之间不能有空格,否则模块编译不到;

CONFIG_TOUCHSCREEN_MTK_FT3X27=y

2). O版 本代码,修改DTS文件需要单独编译:make odmdtboimage -j16 2>&1 | tee log.c

3). 在项目目录下有一个modified_files/文件下对应的文件会被此文件拷贝替换,所以,在编译的时候如果有东西被替换,要去看看这个文件里是不是有对应的文件。

4). 编译报错问题

编译报错关键字:error: ,  FAILED,   undefined,   multiple definition,   Error,

5). 服务器断开后依然可以后台编译的指令:

nohup sleep 6h && make -j24 2>&1 | tee build.log &

然后exit,一直到退出;

6). 延迟服务器 编译

screen -S <窗口名字> -- 新建一个窗口

然后在这个窗口里执行编译或者任何命令

再按crtl+a+d -- detach掉这个窗口

要重新连接的话  登陆shell  执行screen -ls查看窗口

然后screen -r <窗口名字>重新连接就可以了

最后不用时 screen –ls看下进程号  kill掉就可以了  或者用killall screen命令杀掉所有窗口

7). 在编译多个项目的时候(多项目共仓场景),经常会出现编译报错问题,这是因为,frameworks/base目录下的文件被修改导致,git checkout . 就好,如果还不好就把frameworks/目录下的所有文件都 :        repo forall -c "git reset --hard && git clean -fd

8). 编译OTA升级包,make -j24 otapackage   ,后面编译出来的软件需要压缩,然后放到/storage/sdcard0/里面,之后通过setting----》system update 里面进行选中升级。

9). 编译模块

10). MTK原始代码编译处理过程,后面都是在这基础上添加的新项目:

source build/envsetup.sh

source mbldenv.sh

lunch

Make bootimage –j16 2>&1 | tee log.c

11). 下载的scatter文件如果没有了可以删掉这个文件后编译一个PL

out\target\product\rlk6580_weg_n\obj\PTGEN

12).   查看项目 配置文件在哪里:device/lge/dh0/AndroidBoard.mk

13).

6. log问题 打印信息问题:

1). 后台抓取上层应用log :                  logcat >/sdcard/logcat.log

查看main LOG实时信息:      adb logcat -v time  > /sdcard/ log.txt

2). ADB工具抓取实时LOG时经常断开,可输入指令:

while true; do cat proc/kmsg | grep -rn GTP;done;    保证全程无打断;

3). echo 4 4 1 1 > /proc/sys/kernel/printk          这样就可以打开量产后DPM关闭的printk;他们所说的关闭,实际上只是把打印log的优先级给调低了;

4). fastboot oem p2u on

fastboot continue可以抓取LOG

5). Android打印堆栈

(1).java中打印堆栈的函数。

              Log.d(TAG, Log.getStackTraceString(new Throwable()));

加上上面这行代码,需要import android.util.Log;  意思是类似头文件 ,否者编译会报错。

(2).c语言中打印堆栈的函数:       dump_stack();

(3).cpp中打印堆栈的函数是:

#define LOG_TAG "tzbLightsService"

CallStack stack(LOG_TAG);

//stack.update();

//stack.dump();

或者  CallStack cs(LOG_TAG);

注意:在cpp代码中,加了上面打印堆栈的函数后,需要#include <utils/CallStack.h>这个头文件,否则编译会报错。

6). 如果用USB串口抓不到LOG可以飞两根线出来,其中TX接到绿色的线,GND接到黑色的线上,

7). 在需要重启的地方加上BUG()就可以,不需要头文件;

dump_stack();在函数里面加上这个可以打印出是谁调用该函数;

8). MTK提供的异常入口:         /data/aee_exp

这个要重启才会生成,但也不是没有办法,在函数里添加函数BUG()程序走到这里时就会重启,也就会生成这个文件,可以进行调用栈的分析。

9).重启log问题

搜索:assert,   oops,    mtk_arch_reset, pc is at等;

第一:mt_power_off等,系统关机;

第二:i2c_ackerr,error,failed等,系统不一定重启,不一定相关。

第二boot_reason,reboot,oopspc is at(前面是错误原因;后面是栈的调用)多数为空指针问题(使用的变量或者函数没有实现初始化)

第三:Call trace:(异常函数调用问题)

堆栈代码。比如下面的堆栈,也可以使用 addr2line来查找堆栈的具体代码。

[0][237: recovery][<c03c6fa8>] (mdss_fb_set_backlight+0x144/0x184) from[<c03c72b4>] (mdss_fb_blank_unblank+0x2cc/0x318)

命令为:addr2line -e out/target/product/elden/obj/KERNEL_OBJ/vmlinux c03c72b4

(注意:重启的话会有这两个文件,如果有SWT文件,说明是上层导致的重启。

10). 按键LOG

Line 24085: 06-05 17:41:35.455187    55    55 I [ 5075.485189] (0)[55:pmic_thread]: [PMIC] [PMIC_INT] Reg[0x91a]=0x1

Line 24086: 06-05 17:41:35.455283    55    55 D [ 5075.485285] (0)[55:pmic_thread]: (pressed) HW keycode powerkey

Line 24088: 06-05 17:41:35.602154    55    55 I [ 5075.632156] (1)[55:pmic_thread]: [PMIC] [PMIC_INT] Reg[0x91a]=0x4

report Linux keycode =

后面的值为114为音量下键,115为音量上键,116为电源键

11). 将下面的宏打开后即可在串口LOG里查看实时信息

第一:

第二:user版软件抓串口LOG要打开的地方:

vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c

第三:打印串口LOG信息,(USB转串口,传 音客制化                (关键字可能不一样)

12). 抓取关机LOG:

方法一:抓串口log;该方法抓的最全;

            13).

7.命令,快捷键或者指令:

1). ADB常用的:

查看TP报点率:getevent -ltr

查看中断触发次数:    cat proc/interrupts

查看开机上层Log:    adb logcat  > Desktop/logcat.log

查看开机kernel log:   adb shell dmesg > Desktop/dmesg.log

查看TP事件的详细信息:getevent -p

查看TP报点坐标或者按键坐标:getevent  -L  /dev/input/event7

查看距感alsps的状态:只需要查看get_psval的置复位状态:

cat         /proc/kmsg | grep -rn psstatus

手机录像指令:adb shell screenrecord --size 720x1280 /mnt/sdcard/test.mp4

(pull  /mnt/sdcard/test.mp4  D:\ )

查看手机lcm和tp型号:adb shell cat /proc/cmdline > x522.log

在ADB端通过这个指令可以直接打开log文件,方便快捷:notepad x522.log

2). 插入USB手机就不休眠的指令:

adb shell settings put global stay_on_while_plugged_in 7

3). 查看服务器谁在编译:ps -aux | grep make

4). 自动化测试添加权限编译模块是用指令:mmm external/sepolicy/

5). 使用ADB点击屏幕指令:adb shell input tap 240 560

6). 如果要划线:adb shell input swipe 360 0 360 640

7). 汇顶查看参数的指令:adb shell " cat /proc/gt9xx_config" 或者

adb shell " cat /proc/gt1x_config"

8). 手掌大面积上报键值是用:节点"mtk-tpd"查看

9). 在VI里 ctl + z;是后台运行,jobs查看后台运行的程序,fg + 后台运行的序号,可以跳转到程序去执行。

10). 查询IMEI号指令*#06#

工厂模式mediatest:*#87#  没有校准的时候使用 *#878787878787*

工程模式:*#9646633#

如果没有添加,可以用:*#3646633#

11). 通过adb读取和修改MTK主芯片寄存器的值:CPU端其他控制器端的寄存器没有通用的读写指令,显示模块,pmic寄存器可以读写,

显示控制器端寄存器可以按照如下命令进行读写echo regr:addr >     /sys/kernel/debug/dispsys   读取display 寄存器值;

echo regw:addr,value > /sys/kernel/debug/dispsys  修改display寄存器.

12). Readlink –f /sys/class/leds/lights

通过这个指令可以查看lights节点链接的实体文件,class里面的是虚拟文件;

13). 代码全部清掉并且同步

repo forall -c "git reset --hard && git clean -fd && git pull --rebase"

14).   linux快捷键:

在函数内部调到该函数开始处:{

在函数内部调到该函数结束处:}

搜索文件不区分大小写:find ./  -iname hall.c

在vim中搜索默认是区分大小写,设置不区分大小写后再搜索就可以了: :set ic

15). 通过这条指令反汇编生成的文件:

./out/target/product/rlk6737m_65_m0/obj/KERNEL_OBJ/scripts/dtc/dtc -I dtb -O dts  -o  h372.dts  out/target/product/rlk6737m_65_m0/obj/KERNEL_OBJ/arch/arm64/boot/dts/rlk6737m_65_m0.dtb

或者直接找源文件:kernel_dir/script/dtc/dtc -I dtb -O dts -o xxx.dts xxx.dtb

不然,自己看会是乱码。最终都会在 项目名.dtb 里去显示

16). 拷贝问题

cp --parents device/mediatek/mt6761/device.mk ../temp/

将device/mediatek/mt6761/目录下的device.mk拷贝到temp/device/mediatek/mt6761/目录下

这个参数实现了拷贝的同时新建相同路 径

cp --parents kernel-4.9/drivers/input/touchscreen/mediatek/nt36572_common/* ../temp/

拷贝文件夹时,直接使用*适配所以文件

17).  Remount机制
                        adb remount流程:
                       1.进开发者选项,OEM unlocking打开
                       2.adb reboot bootloader
                       3.fastboot flashing unlock //显示成功,等待手机格式化
                       4. 开机后执行adb root
                       5、 adb disable-verity
                       6、adb reboot
                       7、adb root
                       8、adb remount

18).

8.关键字搜索, 标识位

1). 查看MTKLOG系统的问题搜索watchdog

2). 去掉空格,先打开vi之后运行冒号+ %s/\s*$//g

3). 音量上下键 kernel里没有log 可以看main log里搜索 keyCode;   keycode 24是上键; 25是下键 26;是power键;

4). ctl + r  :快捷键是搜索最近输入的

5). 搜索屏的分辨率,bom里面搜索LCM_HEIGHT或者LCM_WIDTH

6). MTKLOG中的kernel log的实时时间怎么看,搜索UTC

7).在main.log里面可以直接搜索照片的名字找到时间点

8). grep 搜索egrep  -rn “关键字 | 关键字”就可以同时搜两个内容

9). 各模块节点所在的位置:

手势节点:/proc/gesture_function          可查看节点内容测试手势时候生效;

手势打开:echo “al1”>/proc/gesture_function

手势关闭:echo “al2”>/proc/gesture_function

手势开关:/proc/gesture_state              可查看各个手势的开关状态;

霍尔节点:/sys/class/switch/hall/state         可查看霍尔状态,有皮套时值为1,无皮套时,值为0;

TP的几个状态标 识 位:

休眠唤醒:doze_status 为1的时候进入休眠,为0的时候进入唤醒;

距离传感:get_psval 为1的时候靠近,为0的时候远离;

皮套霍尔:hall_gpio为1的时候皮套合上;为0的时候皮套没合上;

10). 通话过程中的LOG信息:Phone switching state(通话有关的关键字);INCOMING -> INCOMING(表示来电);INCOMING -> INCALL和INCALL -> INCALL(表示接通);INCALL -> NO_CALLS和NO_CALLS -> NO_CALLS(表示挂断)。

11). 权 限 问 题搜索关键字:avc denied

遇到问题不确定是否由于selinux问题造成,可先在adb shell 下,输入setenforce 0,让selinux失效,看是否问题还出现。以此可以澄清是非selinux造成的问题。

12). 指纹解锁关键字:fingerprintd               如果搜到,代表用过指纹解锁;

13). 电源键按下后,power key的值为1;松开值为0; 电源和音量下键同时按下,并且同时松开;

14). 电源和音量键的关键字是keycode 为true的时候表示按下;为false的时候表示松开;

15). 进入相机预览界面的关键字是:或者onPreviewFrame 或者handleMessage: 16

16). 插上USB的关键字:UsbDeviceManager  ;

拔掉USB的关键字:USB UEVENT ;

17). 退出充电模式的LOG:charger NOT exist

18). 插拔耳机的关键字;搜accdet,或者plugin plugout

19). iddig_state = 0 时表示OTG插入;为1时表示拔出;

20).

9.权限问题:

1). META模式权 限 问 题:用LOGCAT查看:logcat > /sdcard/1.txt

# avc: denied { search } for name="bus:touch@" dev="sysfs" ino=4333 scontext=u:r:meta_tst:s0 tcontext=u:object_r:sysfs_mtk_tpd_file:s0 tclass=dir permissive=0

allow meta_tst sysfs_mtk_tpd_file:dir search;

修改权 限 文件:device/mediatek/common/sepolicy/basic/meta_tst.te

说明:

avc: denied { getattr } for path="/sys/devices/platform/leds-mt65xx/leds/lcd-backlight/brightness" dev="sysfs" ino=9019 scontext=u:r:shell:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0

allow shell sysfs:file { getattr read write open };

分析过程: 
缺少什么权限:           { write }权限, 
谁缺少权限:               scontext=u:r:kernel:s0,

对哪个文件缺少权限:tcontext=u:object_r:block_device

什么类型的文件:        tclass=blk_file

解决方法:kernel.te

allow kernel block_device:blk_file write;

大招:

如果已经按照上面的方法改了,发现还是提示相同的错误;可以跳过MLS检查,直接在file.te里面修改:type proc_gmnode, fs_type, mlstrustedobject;

或者当添加的selinux权限不生效的时候可以重置selinux的安全上下文,即selinux文件的配置:            system/core/rootdir/init.rc

restorecon +目录或者文件;restorecon -R /var/www/html/

ls -Z

U:r表示主体;u:object_r表示客体;后面的s0表示MLS安全级别,也是最低的安全级别;c512,c768这个是和s0不同导致; SEandroid是从SELINUX上移植过来的,对MLS已经做到了足够的弱化。

2). restorecon restorecon命令SELinux restorecon命令用来恢复SELinux文件属性即恢复文件的安全上下文。   http://man.linuxde.net/restorecon

/*使用restorecon来恢复文件的SELinux配置信息(如果目标为一个目录,可以添加-R参数递归)*/

是因为这个文件的SELinux配置信息是继承原来那个目录的,与/var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一起移动过来了,从而导致无法打开页面,

其中ADB访问权限文件是:shell.te

Meditest权限文件是radio.te

Meta模式权限文件是meta.te

文件:device/mediatek/common/sepolicy/

Allow 域(进程) 文件 xx 指定的操作

PROC是虚拟的文件对应的是file_contex

Sys 是具体的文件对应的genfs_contexts文件

selinux权限还是主要分两类,一个是te机制还有一个就是应用里面的设置,一般是在mainfest.xml文件中设置的权限。  一个文件是否有权限访问一般涉及几个原因 1、创建文件时的权限 2、selinux赋予该文件的权限,但该文件权限又一定程度上依赖他上一级文件的权限和他所属进行的权限(这个故事有点长)。 restore只是在我们赋予的文件的客体对象没有生效的时候进行恢复使用,因为如果一层一层的去找不一定能找得到。

Readlink –f /sys/class/leds/lights

通过这个指令可以查看lights节点链接的实体文件,class里面的是虚拟文件;

3).

10. effuse,签名问题

            1. EFUSE导入后软件编译方法

根据项目安排,目前E31项目已经开始导入secure boot功能。目前SCM编译的软件含有efuse关键词的可能无法下载和开机。请各位知悉。

本邮件所述内容仅针对MT6737/MT6735/MT53/MT6580平台。针对MT6750/MT6755/MT6797/MT6799的方法,我们会后续释放。

(1).       Secure boot功能导入后,需要烧录EFUSE到CPU,系统才能正常启动(开机)。

(2).       软件编译的方法见下面邮件内容,后续I3所有BOM都会导入Secure boot支持。

(3).       EFUSE只需烧录一次,建议第一次下载支持Secure boot功能的软件时使用工具组提供的工具,这样可以在Download完成后,直接烧录EFUSE到CPU。请注意,在工具提示PASS前,请不要拔出USB,以防烧录EFUSE失败,损坏CPU。

(4).       使用Flash tool下载支持secure boot的软件

2). efuse签名:

./vendor/mediatek/proprietary/scripts/sign-image/sign_image.sh

3).

11.下载问题:

1). 强制下载,这一端接地;

12.中断问题:

1). 查看中断号:  cat /proc/interrupts

查看中断管脚信息 :cat proc/interrupts |grep TOUCH_PANEL-eint

2). 中断触发方式:如果设置为NONE会调用dts文件里的中断配置;

3).

4).

13.兼容问题:

1). 在TP做二供兼容的时候,

兼容方式一I2C通信

I2C读ID读偏了,导致有一个TP不工作,TP修改I2C通道

i2c3中的3表示3号bus线,这个一定不能搞错,不然会I2C不通,后果很严重。其中38前面的_2是多余的;

最后提交的时候在项目文件里提交,但是在修改的时候kernel下也要同步修改,因为项目里的在编译的时候会把kernel下的dts文件替换掉,但是最好还是都改。

492 cap_touch@48 {

493              compatible = "mediatek,cap_touch_2";

494              reg = <0x48>;

495              status = "okay";

496          };

497 };

上面的名字是cap_touch,下面的是加2的,是为了区分二供和一供;

Compatible表示兼容;

兼容方式二:SPI通信

遍历device可以自动按顺序遍历,一二供都是一个device_name,通过SPI总线进行信息回读来确定是哪颗IC;

2).  兼容LCM的时候还要在下面这个路 径下添加

背光修改:

3).

14.工具问题 (source insight, gat,git bash,pads,vi):

1). 敦泰固件烧录工具的使用,要在ADB上设置权 限 问 题:setenforce 0 关闭权限。

2). source insight使用(文件少的时候用ctags ,文件多的时候用source insight

                  (1)新建项目,add tree 和add all都行,添加完成后使用project-》sysnyce同步,勾选子目录,

                  (2)同步问题:如果使用的时候发现有函数是暗的没有被关联到,这时候需要rebuild,   project->rebuild project

                  (3)使用技巧:shift + F8是高亮函数或者内容,再shift + F8是取消高亮;

Ctrl + 鼠标左键   是进入函数定义;

Window 菜单可以查看最近打开的文件;

                  (4)搜索技巧:ctrl +f 是在当前文件进行搜索,可以上下切换搜索结果;

全局搜索;

(碰到关键函数不知道在哪引用的,可以搜索”.加函数或者变量”)

(5) source insight 快捷:

跳转到函数或者变量定义处:ctl + 鼠标左键

向前跳转到查看记录:alt + ,

向后跳转到查看记录:alt + .

3). gat使用方法:

首先,到处AEE文件:/data/aee_exp 每部重启的手机里都会有这个文件;

打开GAT点击window选择open logviewer 紧接着出现LOG工具;点击file选择open aee db;

打开DB文件解析即可。先查看exp_main.txt,再查看sys_kernel_log;

4). 这个是GIT 提交记录的可视化工具,相当于git log

​ 

也可在该界面查看报点。

5).在线流程图,思维导图工具 processon   网址:https://www.processon.com/diagrams

6).我常用的pads指令只有屏蔽线:

第一:打开setup,设置除了pads焊盘显示外其他的都不显示,即取消勾选;

第二:以及在top层和bottom层之间来回切换;

alt 之后输入1    //为top层

alt 之后输入b    //为bottom层

7).  vi界面(ubuntu 操作系统)新建窗口快捷键:ctrl + alt +t   和ctrl + shift +t  ;

8).

15. 版本问题,版本号问题:

1).串口log查看软件版本号的时间[BLDR] Build Time: 20190308-062801

2). 查看当前patch版本信息:vendor/splconfig/MTK_Patch_README.xlsx

3). 在代码里面区分内核版本号:

#if KERNEL_VERSION(3, 7, 0) <= LINUX_VERSION_CODE

4). 查看软件版本号的文件:在项 目 配 置文件下 搜:MTK_BUILD_VERNO

5). 如何在编译生成文件里查看是user还是eng版本:

方法一:vi build.l o g

方法二:vi     out/target/product/k37mv1_bsp/system/etc/prop.default

这样就是ENG;

6).

16. JIRA测试报问题分类:

1).jira上面的resolve类型分类:

will not fix      该问题解决不了;

Reject         该问题不是问题,包含操作手法等;

Cannot reproduce    无法复现的问题需要软测继续复现,我们需要继续跟进

Duplicate       重复提问题

2). 测试报的问题等级:major,  critical,   block,  MP BLOCK

问题等级逐步提高,对解决问题的时间要求也越来越少。

3).

17.代码提交问题  gerrit问题:

1). gerrit提交问题

git commit --amend修补提交用法,当有两笔提交的时候,一般运行git commit --amend的时候修改的是最近一笔提交的信息;而你想修改第一笔提交的信息,这时候你需要运行指令:git reset --soft  commit_id; 其中commit_id为你git log查看到的commit记录,之后你再git commit --amend修改的就是你指定的第一笔提交的信息了。

如果你一顿骚操作,发现代码乱套了,需要重新拉取代码,如果你不删除原来的代码,就拉,你会发现你拉的代码包含了你提交但是么有Merge的代码,这时候你需要删除原来的代码之后再去拉,这时候就都是最新的代码不包含你提交但是没有merge的代码了。

2).git add 代码修改之后,使用git diff --cached 依然可以查看修改内容;

3). 解决cherry pick冲突问题

​然后进到目录里面输入,之后不冲突可以直接git commit,如果冲突就修改冲突,之后git commit的时候需要注意,要把chang id 一起拷贝才可以,

BUG ID: XLLJHBLEW-865

DESCRIPTION: [x609]兼容三供TP FT8006P

Change-Id: Ib6ce63c17dfe291a0884da71d72c6613140346db

这样就确保可以提交成功;

4). 在git库里面有一个.gitignore文件,里面写明了在Git add 的时候忽略的文件,例如.i;.o;在提交的时候我们要添加git add –f +文件;强制提交;

5). 应用场景:提交的代码PUSH出现了error,必须要同步代码时使用下面方法:

git stash          //暂存

git stash list     //查看暂存列表

git stash pop   //弹出暂存列表中最上面一条,应用到当前git库中

6). gerrit提交对齐脚本

vim如何删除行首、行位空格、空格行

删除空格行:

非编辑状态下输入:g/^$/d

删除行首空格:

非编辑状态下输入:%s/^\s*//g

删除行尾空格:

非编辑状态下输入:%s/\s*$//g

7).

18.备忘录

1). 霍尔传感器模块:有两道模式监测机制,kernel会监测一次模式,开机后应用也会读一次模式的;

2). 安卓O版本现在如果只编译BOOT不能有ROOT权限了,还要编vendorimage

3). 修改手机莫名其妙没电,是因为CPU没有休眠,有死循环导致;

4). TP IC响应中断的时间:汇顶是32.5ms;mstr是12ms;敦泰是二十几ms;

5). kzalloc在申请内存的时候会给内存初始化为0;

6). sizeof不能用于extern变量

7). 包裹头文件可以用两种方法,

一个是在Makefile 里面添加,可以添加一个目录,

obj-$(CONFIG_TOUCHSCREEN_MTK_FOCALTECH_TS) +=     focaltech_flash/

另一个是绝对路 径:../../../include/xx.h

8).TP唤醒的时间可以通过MTKLOG计算,更精准

​其中下面的减去上面的就是TP唤醒的时间210ms;

9). 修改看门狗时间:

vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6797/mtk_wdt.c

mtk_wdt_set_time_out_value(10);

10). TDDI 是一颗IC(里面含有TP & LCM的功能),HYBRY是两颗IC(TP 一颗 & LCM 一颗)

On Cell是指将触摸屏嵌入到显示屏的彩色滤光片基板和偏光片之间的方法

11). mstar和汇顶的按键都是通过读取IC的寄存器获取按键值,而不是坐标,所以按键范围没法修改;而敦泰的按键是获取的坐标,把按键和TP做在一起,可以修改按键范围。

目前几个IC,新思,汇顶是有路 径接口的,可以通过应用层指定配置文件的路 径,这样可通过不同路 径兼容;目前mstar和墩泰的没有路 径接口,但是他们apk内部会去识别读一个寄存器然后去固定路 径下查找对应的配置文件,这样更好兼容,

12). 查看TP固件信息:是十六进制显示的。

13). 如果没有假电池可以通过焊线来替代

VBAT连接VDD,VBAT-ON连接10K电阻,另一端接地就可实现假电池的效果。

14). 开机流程中,先走到init.cpp然后再进入内核;

15). ​查看项目是几位的,mv后面如果跟64就是64位,不跟就是32位;

16). getevent查看驱动层KEY_F13事件已经正常上报,但是PhoneWindowManager收到的key值一直是0。

如何检测上层是否声明KEY_F13事件;

(1).Mainlog显示信息:

WindowManager: interceptKeyBeforeQueueing keyCode = 0

(2).用ADB工具操作:

adb shell "dumpsys input" >input.txt

再把 /system/usr/keylayout/ Generic.kl文件pull 出来;

请把注释# key 183 F13解开,然后执行 adb remount和adb push再把这个kl文件push回去再测;

17). 实验一:一供手势在MODULE_INIT里,二供手势在probe里,就会在/proc下注册两个手势节点。后面的数字表示一二供。

实验二:调用删除手势节点函数;

都把手势放到probe里二供正常,一供出现两个节点,检查发现是二供在load_status之前就加载手势函数了。

18). 分辨率:

手机的显示的像素点阵是几行几列的,或者拍的照片的像素点阵是几行几列

常用简称如下 :

        QCIF   176*144

QVGA   240*320

HVGA   320*480

QQVGA  128*160

WQVGA  240*400

VGA     640*480

       XGA     1024*768

WVGA    480*800

SXGA     1280*1024

UXGA     1600*1200

QHD分辨率为 960x540

HD屏等于1280·720

FHD等于1920*1080

19). 固件升级关掉

敦泰的宏是focaltech_core.h里面的TPD_AUTO_UPGRADE

汇顶的是在配置文件里的CONFIG_GTP_AUTO_UPDATE=y还有一个CONFIG_GTP_REQUEST_FW_UPDATE

20). 汇顶TP在休眠的时候去读取TP固件版本号:

cat /sys/devices/platform/mtk-tpd/tp_firmware_version   是读不出来的值为ffff;

敦泰的是可以读出来的,因为非手势休眠的时候断电,无法读取;

21).

关闭TP固件自动升级功能不会影响TP其他功能的,代码流程需要我们自己排查确认,后面有不清楚的问题多和老员工沟通确认,专项测试的修改说明,TP固件版本号,测试重点都要我们交代清楚,提高测试有效性。

22). 更新代码:删除仓的方式:

                         1. repo forall -c git reset --hard

                         2. repo forall -c git clean -dfx

                         3. repo abandon mt6580_h801_master

                         4. repo sync

                        5. repo start mt6580_h801_master –all

23). 有什么问题可以在online上面查看之前MTK给的分析思路

24).  http://10.150.1.193:8090/pages/viewpage.action?pageId=24685925

hall测试 后面要加入ATA里

25). 网站:查询 根据手机使用的平台查询已经出货的手机

http://detail.zol.com.cn/cell_phone_advSearch/subcate57_1.html

26).根据datasheet来判断寄存器

27).

驱动辅助资料(工具,目录,指令,debug经验)相关推荐

  1. android_驱动_camera_性能Debug经验

    针对手机厂商相机性能优化部分进行重点总结记录 Android Camera性能Debug经验 一.相机性能场景 二.相机性能debug工具及方案建议 1.dumpsys media.camera 1. ...

  2. .NET 程序员十种常用辅助开发工具

     .NET 程序员十种常用辅助开发工具      一: .NET 程序员十种工具 - Visual Studio Converter(转换器工具) Visual Studio .NET 项目转换器(参 ...

  3. 领域驱动设计(DDD)的实践经验分享之持久化透明

    领域驱动设计(DDD)的实践经验分享之持久化透明 原文:领域驱动设计(DDD)的实践经验分享之持久化透明 前一篇文章中,我谈到了领域驱动设计中,关于ORM工具该如何使用的问题.谈了很多我心里的想法,大 ...

  4. labelGo:基于 YOLOv5 的辅助标注工具

    来源:AIZOO 在我们平常做 深度学习检测项目时,可能经常需要标注数据,但是标注数据,本身又是一件很麻烦的事情.今天,看到 Github 有个大佬开源的基于 YOLOv5 的辅助标注工具,推荐给大家 ...

  5. Android Camera简单整理(四)-Android Camera性能Debug经验

    针对手机厂商相机性能优化部分进行重点总结记录 Android Camera性能Debug经验 一.相机性能场景 二.相机性能debug工具及方案建议 1.dumpsys media.camera 1. ...

  6. 5 个 APP 自动化测试辅助定位工具,你用过几个?

    UI 自动化测试时,先要定位到需要操作的元素,然后才能执行指令. 在网页端可以非常方便的通过 devtools 工具(也就是经常说的 F12) 获取和编写元素定位表达式. 但是在移动端自动化时,这种辅 ...

  7. 图解VC6辅助编程工具的使用

    一 Visual Assist X 解压后包含2个东西: 拷贝VC6LineNumberAddin.dll到如下目录:根据自己的安装目录更改: 运行如下图一个reg文件: 为了保险起见:先看下该reg ...

  8. 【sketchup 2021】草图大师的辅助建模工具2【模型交错、照片匹配(重要)】

    文章目录 量角器与文字.尺寸标注与三维字.实体工具 模型交错 鼠标右键 编辑菜单 示例 照片匹配 基本用法说明 建模一个床头柜示例 量角器与文字.尺寸标注与三维字.实体工具 一篇文字2w字左右,多了看 ...

  9. 我的世界红石音乐高级教程 python辅助制作工具

    我的世界红石音乐高级教程 python辅助制作工具 https://www.bilibili.com/video/av52803181/ QQ群:374821554 游戏资源下载(材质.MOD等)提取 ...

最新文章

  1. 独家|深度学习训练和推理之间有什么差异?
  2. C++智能指针简单介绍
  3. 2018年python薪资_2018年国内就业薪资高的7大编程语言排行
  4. Java 10 – JEP 286:局部变量类型推断
  5. CodeForce 168 C——Wizards and Trolleybuses
  6. 百度地图 json 区域 数据_获取百度地图可视区域范围的数据
  7. 第38周星期四电话会议忙碌的一天
  8. Egret入门学习日记 --- 问题汇总
  9. NBA历史上50大巨星2
  10. 查看计算机GUID的WMI类
  11. html网页计算器代码form,HTML网页之计算器代码
  12. 读取cpu温度的api_获取传感器温度-cpu 温度篇
  13. Word页面中底端如何画一条横线,再下端写文字?
  14. 计算机竞赛制作机器人,电脑制作活动机器人项目详细说明
  15. [go]简单的RPC框架
  16. mysql怎么集合查询_MySql集合查询
  17. 计算机在摄影应用,计算机X线摄影在临床中的应用
  18. R语言使用Predict函数计算指定连续变量和风险比HR值的关系、基于限制性立方样条分析方法、限制性立方样条cox回归模型
  19. 网络推广员的工作职责,如何做好网络推广员
  20. python的scapy,Scapy在Python脚本中

热门文章

  1. python万年历实验报告_Python编程——万年历
  2. 操作系统——如何求磁盘的物理地址
  3. 批量手机号归属地查询
  4. 群发邮件软件怎么发,教你邮箱群发邮件小技巧
  5. word中审阅和修订、批注
  6. Python dict字典基本操作
  7. 年终礼品交换潮iPhone、iPad最抢手
  8. Jtapi开发之转接二 传递uui
  9. c语言素数筛法与分解素因数,质因数分解及代码:
  10. 网站搭建之三(APMServ5.2.6)