谈谈过去1个月修改过的BUG--3G模块问题(1)

来源:互联网 发布:nginx lua http 编辑:程序博客网 时间:2024/05/16 12:52

    步入11月份了,自从上个月答应老大接手手机项目的3G模块至今,已经有一个月了吧。这一个月来,一直围绕着3G模块的那几个BUG在查原因,在抓LOG,很是辛苦,但后来解决之后,倍感欣慰。


    先简单描述一下这个手机项目,CPU选用三星Exynos4412,和即将在本月27号登场的MX四核手机同一款CPU,3G模块选用XMM6260,然后系统跑的是android 4.0,于是kernel选用linux 3.0。其它模块由于不是本人负责,而且与本篇文章暂时无关,就不描述了。


    本人负责的是3G模块,由于接手前已经由一后来离职的工程师调通,所以基本上我只需要修改BUG。经测试发现,该模块有以下BUG:

1、开机后,只能进入一次深度休眠(以下简称“休眠”),唤醒后就再也无法进入休眠。

2、3G的加入影响了休眠唤醒速度。

    这两个BUG由于涉及内容太多,在刚刚接手时一时不知道该往何处下手。来公司4年多了,基本上很多问题都是跟休眠唤醒有关,不管是以前做过的WINCE,还是现在做的android,无一例外。


    废话不说,先研究一下此3G模块。后来发现6260驱动主要由三个部分构成:模块控制部分、主控USB部分和数据传输部分。模块控制主要配置基本的IO口,完成模块的上电复位等操作,以及注册中断处理函数,为上层提供一系列的控制接口。由于6260属于HSIC(即High Speed Inter Chip简称)设备,通过USB进行传输,故此部分的代码显得至关重要,在实际的调试过程中,确实花费了很多时间与精力来研究它的相关代码。数据传输部分主要为USB转串口的驱动,所有的数据都是通过这个驱动进行数据收发的。


    仔细研究了数据传输部分的代码,实际就cdc_acm.c文件。在acm_resume函数中有一句代码:wake_lock_pm(acm->parent);,作用为申请锁,做过android开发的也许都知道,应用程序一旦申请了休眠锁而不释放,那么系统就无法进入休眠,在此模块中,也不例外。但其实去掉这句代码后,还有其它问题。


    围绕这句代码,我改了好几天,释放锁、在别的地方申请锁及释放等……一直都得不到一个满意的结果。后来比较其它项目的驱动,发现其实cdc_acm.c中并没有用到锁,于是我把手机项目该驱动的锁都屏蔽,结果让人很意外,系统能够正常进入休眠,以及正常唤醒了,测试了好多次都如此!那么,是不是就修改好了第1个问题了呢?按照经验,需要做多次测试后才能下结论。于是把代码发给其它同事帮忙测试,也没发现有什么问题。(在后来的大规模测试中,才发现了由此引发的其它问题,我们后面会讨论)


    再看第二个问题,我把3G驱动卸载,果然发现休眠后唤醒速度提高了许多,不再是之前的按下POWER键需要等待3秒才唤醒了。然后又是漫长的测试阶段……按照经验,系统唤醒后所看到的LOG具有滞后性,也就是说你看到的第一句LOG的时候,系统其实已经运行了N行代码。于是我让硬件工程师帮忙接了两个暂时用不到的IO口出来,在按下POWER键时在相应的地方置该IO口输出高或低,配置示波器,就可以知道代码卡在哪里啦。与休眠唤醒电源相关的代码无非是arch/arm/里面的几个pm.c文件,在里面加了相应的操作,没发现有什么问题。后来又在按键驱动中把IO操作也加进去量,还是没有发现什么问题,按下POWER键的时候,我置高或置低的IO电平是得到期望值的。这么东一改西一改又过去了好几天,一直很郁闷。


    后来又想到一个方法,3G驱动由3部分构成,那么既然现在确定了唤醒时间与该模块驱动有关,可以分步卸载该驱动再测试看看。说做就做,于是把3G的3个部分分步去掉,当然会碰到编译不过的问题,为了这次结果,都暂时把编译不过的地方修改了。果然这么一测,还真让我找到了。当我卸载到只剩下USB驱动后,唤醒时间依旧为3秒钟,那么就应该是USB驱动的问题。


    休眠唤醒都是suspend和resume函数搞的鬼,那么当然重点看这两个函数。我把suspend和resume函数对3G的操作都屏蔽掉,再测试,发现唤醒速度快了许多。这一结果令人振奋!那么就应该是这两个地方了。再一步一步查找,果然让我发现了问题:在suspend中有把mc->in_l3_state置1,但唤醒后没清0!暂且先不管这个变量是做什么用的,休眠前在保存状态,唤醒后恢复状态是亘古不变的真理,于是我在resume中把它置0,奇迹出现了,系统的唤醒速度真的快了许多!!!!


    以上是我调试这两个BUG的一些过程,由于水平有限,不免有错误的地方,欢迎大家提出来并批评指正。

    本以为修改完这两个BUG,3G就不会有问题了,没想到后来经过大规模测试,我们依旧发现了后续的问题,但不管怎样,BUG总会得到解决的。下一篇,我再详细描述由此带来的其它BUG以及解决方法。