android智能手机开发项目小结
从上周六到截至今天下班时,历时一个星期,把一个客户的新项目的板子bring up起来,目前的状态是这个双卡双待的手机能正常运行,LCD色彩、声音、GSM call、sensor、camera、touchkey、keypad、backlight、fm、headphone等都正常工作,可以送QA作进一步的测试,还是有一些需要继续优化的地方。下周跟QA同志们,hardware同志们一起努力,争取客户样机早一点量产。下面就遇到的问题做一个小结吧!
问题1:touchkey不能正常工作
touchkey用的是gt106驱动IC,上面有四个键,一个GPIO练到soc的GPIO上用作IRQ的媒介。我的同事花了一下功夫后,还是不能正常工作,我接手项目后,跟他一起分析原理图,看写的驱动代码。从原理图上,该IO结果一个connector再从PCB中间走到主芯片,刚开始怀疑电平不对,HW同事量了一下给出去的电压是2.48v,GPIO一般供出来的是3v,当时怀疑是不是GPIO的高电平门限值是不是没达到,后面求证得知门限在2v样子,应该这条路是给解释通了,那又是为什么呢?仔细又看了看同事写的代码,request一个GPIO,注册IRQ,设置触发条件,都没问题,后面还有一些创建Input设备的代码,设置bit mask,再register到系统。没有问题啊!郁闷,到底怎么了?当我沉住气接着看下去的时候,狐狸的尾巴露出来了,在probe函数的出错处理代码之前竟然少了一个可爱的return。悲剧啊!我加上了,测试OK了。这个问题的根本问题在于很多代码不是自己一行行写下来的,有时候拷来
拷去的,maybe多delete了一行代码引发了悲剧,这个问题提醒我们工程师在写driver的时候,一定要注意细节,细心细心再细心。
问题二:cameraGC2015不能加载驱动
客户选择的camera模组是GC0309+GC2015组合,两个模块连在一起,都并到一个connector上跟主系统沟通。这两个camera的驱动在我们的平台上是支持的。在kernel中menuconfig已经配上了,加载的语句也加在了启动脚本里面。可以以到2015里面就出乱子了,刚开始的时候根本不会执行它的probe函数。仔细检查了platform里这个2015在IIC设备list里面也是有注册的,正常情况下是会执行probe的。为什么这么折磨人呢,软件工程师就是悲催啊!再深入查了一下,居然挂在同一组IIC上的328x磁sensor的设备地址也是0x30,跟GC2015一样,咋个设计的嘛!哥哥?结果跟客户沟通决定不要磁sensor了,我也就把它的驱动没有编译进内核,也没有加载动作,可是后面还是不行?量了量供电,两个需要2.8v的电正常,需要1.8v的core电压也是正常的,仔细检查了POWERDOWN pin脚跟reset pin都是按照需要给了的,那又能怎样,就是不行,任他风吹浪打!这个时候,大家想到了把这个磁sensor
从硬件上拔掉,物理上没有连了,幸运啊,晚上八点过终于迎来了好消息,哥俩都正常工作了。这个问题本不应该出现啊,在设计的初级阶段,就应该能排除掉这种低级失误,所以说软件工程师啊,还是得多怀疑。
问题三:headphone检测状态不正常
在插入耳机跟不插入耳机的情况下,系统都提示有耳机存在。HW同事反复确认该原理图跟我们某机器是一样的,一模一样啊,信誓旦旦啊!可是我们软件在配置上跟那款机器是走的同一段代码,不会有差异。HW同事有拿来万用表量了量插入检测脚的电平,居然一直是高电平,耳机检测的IRQ类型是高电平中断。唉,难怪啊!这样也算能解释这个问题。后面hw同事继续拔下这个模块用万用表量,唉,板子是坏的,谜团又出来了。没招啊!追根溯源,检查原理图!又是悲剧啊!实际情况不是hw同事说的一模一样啊。插入检测的GPIO只是连到了主soc的GPIO上,而那边base板子是一边连在主SOC上,同时又练到了audio codec上,codec上有register可以检测这个pin电平,直接读这个register就可以了。问题总算发现了,解决起来也不算费劲。因为以前的detect程序里有使用codec的这个register的值做辅助碰到,这也是有好处的,可排除一些干扰、毛刺脉冲什么的。问题就出在,现实已经这样,那就改呗!去掉codec的register的辅助动作,改为判断电平值,问题解决了。有问题的时候,是样样要怀疑啊,否则受累的还是sw。
问题四:light sensor不能正常工作
light sensor用的是2771,别名我们觉得它跟apds的一款差不多。存在的问题,一旦加载这个light sensor的时候,android系统不能进入,DVM一直在喊冤啊!就是进不了系统啊,到不了我们那熟悉又陌生的android桌面。为什么呢?这个驱动很成熟了啊,并且在加载驱动的时候,它的reg都是能读出来的,理论上大局已定啊!可是眼前的问题是系统都进入不了,崩溃啊!再一次看原理图,检查了IRQ的中断GPIO,是个复用脚,又仔细检查了系统控制复用的寄存器设置,没有问题,配置的是GPIO功能。让HW量了量这个GPIO,是低电平,而2771要的初始状态是低电平中断,初始状态应该是高电平,问题点是找到了,顺藤摸瓜,
再接再厉,客户在主板上的接法跟提供的参考机是一样的,但是这个sensor在小板上,小板上有上拉电阻的,客户没有学到家啊!可是我们的hw同事给人家review的时候也没发现。啊,一个小电阻啊!把庞大的android系统都弄挂了,强大!加上这个上拉后,light sensor工作正常了。从这个问题得到的经验就是怀疑,大胆的怀疑加有理的分析。客户的错也是我们的错,我们的目的还是帮客户批量嘛!客户赚大钱,我们也赚点小钱。
问题五:小问题几个
小问题还是有一些的,比如g-sensor的方向,这个试几次也能得到正确的设置,这次用的是BA250,也是比较常用的。还有系统开机的屏亮度,在系统待机后resume后,不一样,resume后回来更亮一些,跟了一下发现同事写的代码有一个漏洞,就是在开背光使能的时候强制写了个亮度值进去,并且是比较亮的值,这种问题还是比较直观,比较好解决。电池校准也还好,有工具接上去几分钟就好了!WIFI无法连接,发现问题是没写mac地址,写入系统后,功能正常。还有一些小问题都一一解决了。
调试一块新板子,真是不容易啊!耐心、细心、疑心,心心相通,脑力、体力、努力,力力相融。bring up板子还是有一些学问的,技术、经验也很重要,也是一件比较辛苦
的差事!一个星期能达到目前的状态,凭心而论,一个半软件工程师真的努力了,辛苦了!愿后面的项目越来越顺利,愿客户的项目能批量出货。