第二次写这类博客,之前还是求职期间写的面试之类的经历。下面是做高通安卓驱动的感言。 同一时候献给择职想做驱动的參考。
不知不觉做驱动再过2个月就3年了。能够说这3年学习到的非常多。老大或者同事们的不吝赐教。针对性通过百度等搜索等。还有就是自己一边工作一边自己研究到的。知识,解决这个问题的能力也是慢慢积累起来的。这二年多来一直在做驱动,由開始開始接触调试LCD TP等等。每次会反复做事,可是自己学习到的也非常多,学会分析关键问题,掌握一些驱动调试方法,事实上调试驱动来说一个printk真的够了。再强大只是了,调试过高通modem側代码后发现kernel是多么好调试。
再调试LCD中首先研究懂得了一些平台操作display的流程与kernel背光操作,之后解决这个问题就非常熟手了。比較难的就是调试qct的lk里面的lcd显示与开机logo保持。这些感觉对于刚開始做驱动还是蛮吃力的那段时间压力非常大。期间会使用delay来调试lk与kernel刚启动出现的问题,比与说在lk里面logo消失或者kernel刚启动时消失,调试过一次lcd lk display后后面不亮的或者其他问题的都非常好攻克了,当然是qct的,调试qrd就轻松多了,主要是问题比較少。启动时显示出现故障使用delay就非常好查了。有的可能说串口输出,可是实践证明delay是最有用的。当然串口输出调试确实非常好比方死机等等。非常强大,个人感觉仅仅要能够输出log,就非常难存在解决不了的问题。
对于TP。无非採样上报。属于i2c设备同一时候属于input设备。调试期间遇见的更多是FAE优化抗干扰与报点。睡眠电流,唤醒不能工作等问题。相比lcd简单的多。
搞lcd tp差点儿相同了,感觉掌握的非常好,问题出现能够高速攻克了,之后又搞了charge与batt,同一时候像休眠问题也在搞。后面一直从事电源管理方面的。charge与batt个人感觉功能ok后兴许还是须要试用期间慢慢优化的,特别是电量不准确问题。做qct出现过插上charger后不能充电问题。还有更多的问题量产前都会慢慢出现。个人认为仅仅要熟悉linux power部分解决不是非常难的,还是那句话linux kernel出现的问题因为有printk最easy解决的,除非是硬件问题。是的驱动与硬件常常相互指责,当出现故障的时候。再说camera,仅仅记得第一年搞过高通realease出来的一个sense模组,另一个须要在其他平台移植过来的驱动。调试过程中无非上上电。拉下RST。移植中出现空指针等。解决完遇见的问题后camera终于会亮起来,当然之后还须要tunning。这个是个非常费力的活。同一时候非常耗时间。以后没有干过camera了,个人认为还是继续研究linux kernel里面的为好。毕竟是做驱动,而不是去为了camera效果一直去tunning。
tunning须要专门的人去做,一旦专门tunning就非常难有时间做别的活了。当然有些公司给tunnning camera的待遇非常好,即使这样我也不会动心去深入搞这块。个人爱好等不一样。后面一直专注于linux kernel。
所在公司不光做手机还会集成其他的模块,这样开发起来相比仅仅做手机的难度大了很多,非常多东西自己得去研究。
比方集成第三方modem。驱动project师活也多。尽管一般厂家会提供驱动可是适配到新的平台难免有很多问题,甚至非常严重的问题须要分析解决。开发难度上层最大,可是驱动是基础,所以稳定性等要求比較高。
比方集成UART挂载的模块,会涉及到串口通讯驱动与数据流等问题。还有sdio接口的模块比方网卡 特别功能的T卡等模块。这里简单的说下可热插拔的sdio设备,当插入设备时,首先sdcc host会出发中断,在core.c里面会依据协议来detect是什么接口设备是sd还是sdio还是mmc,检測到后会出现log:new high speed xxxx,之后就载入驱动。说下usb,拿usb接口的网卡来说下usb流程,首先当kernel启动时hub会检測到usb设备,通过2次RST port来获取设备描叙符,设置address,我们在驱动里面须要找到相应的驱动,对于usb网卡来说。在driver/net/usb以下有很多类似的驱动程序。能够找到最匹配的一个来使用,增加获取到的PID VID CALSS等信息。host会通过这些信息来match相应的usb设备接口,当然很多usb设备不止一个接口。usb通讯能够理解为多个高通串口。这里非常可能须要依据不同的CLASS或者INTERFACE来载入不同的驱动,对于网卡驱动来说有自己driver模型而不须要字符设备等供上层交互,usb设备驱动是linux最复杂点的。就说这么多。等到集成到AP上的模块能够正常工作后,你会发现差点儿每一个模块因为使用到了linux以下的总线。会导致休眠不了。不同的接口都须要自己研究处理,让kernel休眠下来。这部分非常多须要自己的摸索。
尤其是usb驱动的休眠是最不优点理的,涉及到runtime机制。对于手机厂家来说调驱动很多其它的是他们家的外设,通常都有模板。可是对于集成很多其它功能的嵌入式产品来说。功能非常丰富,附加值高,开发难度很多其它,大量的上层须要自己做,就做驱动而言,首先底层须要提供一个类似字符设备或者misc设备接口等供上层读写,驱动写好后须要写个简单的測试程序来open write read文件,再跟下kernel里面的数据流,查查硬件通讯有没有问题。模块接收到没有,会不会丢数据等等。这些稳定性会在后期暴漏出来慢慢改进。
等一切ok后就是kernel里面的睡眠与唤醒了,当然还有第三方模块自己的功耗问题这个第三方负责了。
去年经历过一个非常难解决的问题就是高端平台上1080P LCD偶尔会蓝屏的问题,可是通常一周可能才出现一次左右。甚至不会出现。当时顶着压力花费非常久终于还是攻克了。提case给高通,他们给的不能解决。最后是自己硬着头皮解决的,这个问题难在复现bug非常难,后来发现某个大厂这个平台上都有这个问题,非常庆幸自己能解决大厂不能解决的问题。
解决后高通支持反过来问怎样解决的?倒是非常滋润。对于高通支持project师我想说。他们支持越来越慢,非常多时候全然靠自己,竟然有时说没有机器,可是每次关闭case还是习惯性好评。
从去年開始能够给公司解决一些比較难的底层问题到如今领导把LCD等外设交给新入职的调试,个人能力慢慢成长,如今还是非常关注linux kernel里面一些驱动等研究。解决一些有难度的问题。
虽说说不上精通linux kernel可是能够说非常熟悉。产品底层出现故障能够高速定位分析。个人感觉即使做驱动十年也谈不上精通,毕竟linux kerne是个系统内核,精髓在内存管理等等。说精通恐怕仅仅有那些提交linux改进优化系统内核的人。
前段时间看过别人评价做mtk驱动的。说怎么怎么简单。害了年轻人,个人非常庆幸当时入职选择了做高通驱动。之前也是能够选择做mtk驱动的或者wince的。再加上这家公司技术实力还是比較牛逼的在业界。自己做高通,就我熟知的kernel代码确实非常美丽,外国人写的质量非常高。同一时候设备驱动非常丰富。对于刚參加工作的人确实非常故意处,学到的非常的多。
对于mtk自己没有做过。尽管别人说怎么怎么样,可是国产的毕竟跑起来的也是非常牛逼的。个人认为知识在于深入研究才会长能力。以后有机会倒是想多接触几个平台。可是做linux驱动的感觉与平台关系也不是非常大,毕竟Linux大的框架摆在那里。
记得刚入职时干活非常急非常浮躁。恨不得一下功能就ok。
可是如今干活很多其它的是享受。一种积累。一种深入发掘的过程。
做产品很多其它的是关注是自己后期试用来找出或者測试出来的问题,同一时候定位解决这个问题。
兴许发展方向:研究音频方面,之前自己也学习了不少,可是没有亲自做过,这些都是别人负责的,自己也会拿手机去debug比方耳机插拔 按键 speaker等。这些都是简单的。软件上很多其它的是底层通道切换等等。