MTK 6735M项目F100驱动调试报告
一配置EMMC
按照硬件的选择配置新的flash,因为第一版都是按照MTK认证列表使用,所有一般如果不行有两个可能:
1 配置不正确,需要确定alps\bootable\bootloader\preloader\tools\emigen\MT6735下的flash 配置文件的时序是否正确,修改配置文件
alps\bootable\bootloader\preloader\custom\f100\inc的文件custom_MemoryDevice.h
2 需要硬件配合查看是否EMMC元器件未能贴好,造成不能烧录
二调试LCD
调试步骤:
1 确定LCD的连接方式;
1 确定dws配置正确;
2 确定电源是否正确;
3 确定配置参数的读写方式类型,包括:
LCM_setting_table模式读写:
struct LCM_setting_table {
unsigned cmd;
unsigned char count;
unsigned char para_list[64];
};
LCM_setting_table_V3模式读写:
typedef struct {
unsigned char id;
unsigned char cmd;
unsigned char count;
unsigned char para_list[128];
} LCM_setting_table_V3;
4 确定开关机的时序和读取初始化参数的方法;
5 确定DSI的配置是否正确,此配置函数为
static void lcm_get_params(LCM_PARAMS *params)
6 如果做屏兼容,需要配置
.compare_id = lcm_compare_id,
此项为读取LCD ID进行判断;
调试碰到问题:
1 参数的读写方式不正确,造成屏花屏,换一种读写方式正确;
2 suspend时未能写正确,在待机时出现kernel crash,需要特别注意;
3 未能配置lcm_compare_id,造成做屏兼容时未能自动识别;
4 TE的配置需要特别注意,此引脚MTK的补丁默认TE中断不开;
三调试TP
TP连接的接口为I2C模式
调试步骤:
1 确定dws配置正确;
2 确定中断,电源正确;
3 确定I2C读写正确;
4 确定报点没有断点,TP没有坏点;
5 配置虚拟按键时注意键值范围;
调试碰到问题:
调试的TP为GT9157,出现很奇怪的问题,就是I2C的初始化读写没有报错,但是读写数据就是不成功,最后查找到问题为:
I2C加了下拉的防静电电阻,造成实际上的下拉,但是根据规格书配置要求,必须要做上拉处理,否则容易出现读写不正常,所有此处造成I2C没有正常工作;
三调试sensor system
调试步骤:
一accelerometer
1 确定dws配置正确;
2 确定中断,电源正确;
3 确定I2C读写正确;
4 确定好旋转的方向;
调试碰到的问题:
调试accelerometer出现没有报点,然后换了驱动就可以了,判断为原驱动内的读取x.y.z的方式不对;
二alsps
1 确定dws配置正确;
2 确定中断,电源正确;
3 确定I2C读写正确;
4 确定好旋转的方向;
调试碰到的问题:
调试光感出现距离不对的问题,调试距离判断参数,成功;
四调试camera
调试步骤:
1 确定主副摄像头的型号,在配置文件配置好,添加好驱动代码;
(注意:需要配置alps\device\huaying\f100里的ProjectConfig.mk,此文件为主要配置文件,配置alps\kernel-3.10\arch\arm64\configs里的f100_debug_defconfig)
2 确定dws配置正确;
3 确定摄像头的开关机的时序,按照摄像头的规格书来配置;
4 根据硬件配置好MCLK;
5 确定好是否支持AF,闪光灯功能;
五调试Audio
调试步骤:
1 按照驱动开发资料进行驱动配置,确定好是内置功放还是外置功放;
2 配置好音频功放的输入时序,按照喇叭的功率进行配置,外置功放配置路径为
alps\kernel-3.10\sound\soc\mediatek\mt_soc_audio_v3\mt_soc_codec_63xx.c
3 按照硬件配置mic为单/双;
六调试HEADSET
调试步骤:
按照驱动开发资料配置即可。
调试碰到的问题:
配置dws时需要注意配置好中断;
七调试MSDC
调试步骤:
1 确定硬件是否支持热插拔,进行配置dws;
2 确定硬件的电源是否正确;
调试碰到问题:
调试时一直不读卡,刚开始的时候因为不支持热插拔,怀疑配置不正确,但按照配置文档查找后发现并没有错误,然后开始确定T卡的电源是否正确,强行打开后,也没有识别到T 卡,最后让硬件帮忙查找硬件问题,发现是卡座本身和板子的地短路,所以识别不到T卡。
八调试Battery
调试步骤:
1 确定dws配置正确;
2 确定电源正确;
3 确定I2C读写正确;
4 确定OTG功能的配置正确;
调试碰到的问题:
在初始调试的时候,就发现不插USB不能开机,一直报低电。初始认为是没有配置好,但是在抓取串口信息时发现硬件工作正常,后查看硬件发现电池检测的一个配置电阻没有贴,造成不能得到正确的fuel gauge值。后又发现OTG功能不正常,后通过硬件确定引脚不正确造成,此中断脚应该配置为IDDIG,但在硬件上只是配置为ID脚。
九调试connectivity
调试步骤:
1 确定dws配置正确;
2 确定电源正确;
3 确定I2C读写正确;
调试碰到的问题:
一般来说,FM,BT,GPS不需要调试,只需要按照硬件配置好相关的引脚就可以,所以调试的时候只测试了芯片工作是否正常,但调试这几个元器件时,需要确认的并不只是芯片工作是否正常,还需要测试性能,确定外围天线那块是否工作正常,测试性能时发现FM不能收到台,只有杂音,BT的连接距离短,GPS只是搜到两颗星,并未能定位。经过硬件的配置调试发现FM,BT,GPS的匹配没有调试好,造成这种结果。
调试碰到的一些需要注意的问题:
1 摄像头配置时序需要按照datasheet的需求配置;
2 调试一个灯控制程序,hal层不能调用底层的dev设备,花了大量的时间去确定那个地方引起,最后发现是android 5.1的权限管理比4.4的严格,处理如下:
[Description]
android KK 4.4 版本后,Google 默认启用了SELinux, 并会把SELinux 审查异常打印在kernel log 或者android log(L 版本)中,对应的关键字是: "avc: denied" 或者"avc: denied"
如一行LOG:
<5>[ 17.285600].(0)[503:idmap]type=1400 audit(1356999072.320:202): avc: denied { create } for pid=503 comm="idmap" name="overlays.list" scontext=u:r:zygote:s0 tcontext=u:object_r:resource_cache_data_file:s0 tclass=file
即表明idmap 这个process, 使用zygote 的source context, 访问/data/resource_cache 目录,并创建文件时,被SELinux 拒绝访问。
[Keyword]
android, SELinux, avc: denied, audit
[Solution]
KK 版本, Google 只有限制的启用SELinux, 即只有针对netd, installd, zygote, vold 以及它们直接fork 出的child process 使用enforcing mode, 但不包括zygote fork的普通app.
L 版本, Google 全面开启SELinux, 几乎所有的process 都使enforcing mode,影响面非常广.
目前所有的SELinux check 失败,在kernel log 或者android log(L版本后)中都有对应的"avc: denied" 或者"avc: denied"的LOG 与之对应。反过来,有此LOG,并非就会直接失败,还需要确认当时SELinux 的模式, 是enforcing mode 还是permissve mode.
首先, 务必确认对应进程访问系统资源是否正常,是否有必要?如果本身是异常非法访问,那么就要自行消除访问。
其次, 如果确认访问是必要,并且正常的,那么就要对对应的process/domain 增加新的policy.
1). 简化方法
1.1 提取所有的avc LOG. 如adb shell "cat /proc/kmsg | grep avc" > avc_log.txt
1.2 使用audit2allow tool 直接生成policy. audit2allow -i avc_log.txt 即可自动输出生成的policy
1.3 将对应的policy 添加到selinux policy 规则中,对应MTK Solution, 您可以将它们添加在KK: mediatek/custom/common/sepolicy, L: device/mediatek/common/sepolicy 下面,如
allow zygote resource_cache_data_file:dir rw_dir_perms;
allow zygote resource_cache_data_file:file create_file_perms;
===> mediatek/custom/common/sepolicy/zygote.te (KK)
===> device/mediatek/common/sepolicy/zygote.te (L)
注意audit2allow 它自动机械的帮您将LOG 转换成policy, 而无法知道你操作的真实意图,有可能出现权限放大问题,经常出现policy 无法编译通过的情况。
2). 按需确认方法
此方法需要工程人员对SELinux 基本原理,以及SELinux Policy Language 有了解.
2.1 确认是哪个进程访问哪个资源,具体需要哪些访问权限,read ? write ? exec ? create ? search ?
2.2 当前进程是否已经创建了policy 文件?通常是process 的执行档.te,如果没有,并且它的父进程即source context 无须访问对应的资源,则创建新的te 文件.
在L 版本上, Google 要求维护关键security context 的唯一性, 比如严禁zygote, netd, installd, vold, ueventd 等关键process 与其它process 共享同一个security context.
2.3 创建文件后,关联它的执行档,在file_contexts 中, 关联相关的执行档.
比如/system/bin/idmap 则是/system/bin/idmap u:object_r:idmap_exec:s0
2.4 填写policy 到相关的te 文件中
如果沿用原来父进程的te 文件,则直接添加.
如果是新的文件,那么首先:
#==============================================
# Type Declaration
#==============================================
type idmap, domain;
type idmap_exec, exec_type, file_type;
#==============================================
# Android Policy Rule
#==============================================
#permissive idmap;
domain_auto_trans(zygote, idmap_exec, idmap);
然后添加新的policy
# new policy
allow idmap resource_cache_data_file:dir rw_dir_perms;
allow idmap resource_cache_data_file:file create_file_perms;
3). 权限放大情况处理
如果直接按照avc: denied 的LOG 转换出SELinux Policy, 往往会产生权限放大问题. 比如因为要访问某个device, 在这个device 没有细化SELinux Label 的情况下, 可能出现:
<7>[11281.586780] avc: denied { read write } for pid=1217 comm="mediaserver" name="tfa9897" dev="tmpfs" ino=4385 scontext=u:r:mediaserver:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0
如果直接按照此LOG 转换出SELinux Policy: allow mediaserver device:chr_file {read write}; 那么就会放开mediaserver 读写所有device 的权限. 而Google 为了防止这样的情况, 使用了neverallow 语句来约束, 这样你编译sepolicy 时就无法编译通过.
为了规避这种权限放大情况, 我们需要细化访问目标(Object) 的SELinux Label, 做到按需申请. 通常会由三步构成
3.1 定义相关的SELinux type.
比如上述案例, 在device/mediatek/common/sepolicy/device.te 添加
type tfa9897_device, dev_type;
3.2 绑定文件与SELinux type.
比如上述案例, 在device/mediatek/common/sepolicy/file_contexts 添加
/dev/tfa9897(/.*)? u:object_r:tfa9897_device:s0
3.3 添加对应process/domain 的访问权限.
比如上述案例, 在device/mediatek/common/sepolicy/mediaserver.te 添加
allow mediaserver tfa9897_device:chr_file { open read write };
那么哪些访问对象通常会遇到此类呢?(以L 版本为例)
* device
-- 类型定义: external/sepolicy/device.te;device/mediatek/common/sepolicy/device.te
-- 类型绑定: external/sepolicy/file_contexts;device/mediatek/common/sepolicy/file_contexts
* File 类型:
-- 类型定义: external/sepolicy/file.te;device/mediatek/common/sepolicy/file.te
-- 绑定类型: external/sepolicy/file_contexts;device/mediatek/common/sepolicy/file_contexts
* 虚拟File 类型:
-- 类型定义: external/sepolicy/file.te;device/mediatek/common/sepolicy/file.te
-- 绑定类型: external/sepolicy/genfs_contexts;device/mediatek/common/sepolicy/genfs_contexts
* Service 类型:
-- 类型定义: external/sepolicy/service.te; device/mediatek/common/sepolicy/service.te
-- 绑定类型:external/sepolicyservice_contexts;device/mediatek/common/sepolicy/service_contexts
* Property 类型:
-- 类型定义: external/sepolicy/property.te;device/mediatek/common/sepolicy/property.te
-- 绑定类型: external/sepolicy/property_contexts;device/mediatek/common/sepolicy/property_contexts;
通常我们强烈反对更新google default 的policy, 大家可以更新mediatek 下面的相关的policy.
[相关FAQ]
[FAQ11414] android KK 4.4 版本后,user 版本su 权限严重被限制问题说明
[FAQ11485] 权限(Permission denied)问题如何确认是Selinux 约束引起
[FAQ11484] 如何设置确认selinux 模式
[FAQ11483] 如何快速Debug SELinux Policy 问题
3 待机电流不正常,一直有20ma左右的电流不能下来,看串口log信息系统已经睡下来了,查看各个设备都已经进入suspend模式,最后发现是开启了mtk的log功能引起。
查找功耗问题,可以参考以下资料:
如果贵司测试的时候,发现平均功耗高,
1》
首先请去掉所有的APK测试,看平均功耗是否有问题,
如果跟去掉APK之前一样,说明跟APK没有关系
如果跟去掉APK之前相比,功耗有所降低,说明跟APK有一定的关系
跟APK有关系,请自行分析APK。
2》
另外,请抓取相应的待机的mobilelog,
从kernel_log中分析,
如果log中可以查找到
wake up by RTC
请在相应的main_log中查找关键字
Alarm triggering, 其后面对应的type 0, type 2所对应的APk就是唤醒系统的唤醒源,同样请去掉以后测试,
但是com.android.phone例外,
这个APK是ICS android4.0加上的一个google default的机制,
是一个每隔6分钟起来check数据连接是否有问题的机制,
检查是否只有TX没有RX的行为,
一旦检查到系统数据连接有问题,就会做相应的recovery动作
3》
从kernel_log中分析,
如果log中可以查找到
wake up by CCIF_MD
请查找后面一句log相应的CCIF_MD wakeup source:
如果是在您没有打开modemlog的基础上面出现此问题,
请帮忙同时抓取待机时候的mobilelog以及modemlog并附上modem对应的database 便于我司查找问题
如果是CCIF_MD wakeup source: Mdlogger_RX
说明是因为打开modemlog引起的问题,正常
4》
从kernel_log中分析,
如果log中可以查找到
wake up by EINT
一般情况下是由于press power key引起的,
在后面的log中可以看到有wakeup的字样,就说明是power key
其他的情况应当是异常的中断引起的问题
您可以在中断例程中查找此中断的来源
4 卡2单插一张4G移动卡,读卡后出现信号显示一下有,一下没有问题。
出现这个的原因是没有写IMEI号,4G的移动卡一定需要写入IMEI号才能正常注册。
5 需要注意,配置dws的地方有三个。一定都需要配置正确才不会有问题。
第一个路径:
alps\bootable\bootloader\lk\target\f100\dct\dct
第二个路径:
alps\bootable\bootloader\preloader\custom\f100\dct\dct
第三个路径:
alps\kernel-3.10\drivers\misc\mediatek\mach\mt6735\f100\dct\dct
如果有一个地方没有配置正确,会出现驱动出现异常。