做高通平臺安卓驅動感言

 第二次寫這類博客,之前還是求職期間寫的面試之類的經歷,以下是做高通安卓驅動的感言, 同時獻給擇職想做驅動的參考。

         不知不覺做驅動再過2個月就3年了,可以說這3年學習到的很多,老大或者同事們的指教,針對性通過百度等搜索等,還有就是自己一邊工作一邊自己研究到的。知識,解決問題的能力也是慢慢積累起來的。這二年多來一直在做驅動,由開始開始接觸調試LCD TP等等,每次會重複做事,但是自己學習到的也很多,學會分析關鍵問題,掌握一些驅動調試方法,其實調試驅動來說一個printk真的夠了,再強大不過了,調試過高通modem側代碼後發現kernel是多麼好調試。再調試LCD中首先研究懂得了一些平臺操作display的流程與kernel背光操作,之後解決問題就很熟手了。比較難的就是調試qctlk裏面的lcd顯示與開機logo保持,這些感覺對於剛開始做驅動還是蠻吃力的那段時間壓力很大,期間會使用delay來調試lkkernel剛啓動出現的問題,比與說在lk裏面logo消失或者kernel剛啓動時消失,調試過一次lcd lk display後後面不亮的或者其它問題的都很好解決了,當然是qct的,調試qrd就輕鬆多了,主要是問題比較少。啓動時顯示出現問題使用delay就很好查了,有的可能說串口輸出,但是實踐證明delay是最實用的。當然串口輸出調試確實很好比如死機等等,很強大,個人感覺只要可以輸出log,就很難存在解決不了的問題。對於TP,無非採樣上報,屬於i2c設備同時屬於input設備,調試期間遇見的更多是FAE優化抗干擾與報點,睡眠電流,喚醒不能工作等問題。相比lcd簡單的多。搞lcd tp差不多了,感覺掌握的很好,問題出現可以快速解決了,之後又搞了chargebatt,同時像休眠問題也在搞,後面一直從事電源管理方面的。chargebatt個人感覺功能ok後後續還是需要試用期間慢慢優化的,特別是電量不準確問題,做qct出現過插上charger後不能充電問題,還有許多其他的問題量產前都會慢慢出現,個人覺得只要熟悉linux power部分解決不是很難的,還是那句話linux kernel出現的問題由於有printk最容易解決的,除非是硬件問題。是的驅動與硬件經常相互指責,當出現問題的時候。再說camera,只記得第一年搞過高通realease出來的一個sense模組,還有一個需要在其它平臺移植過來的驅動,調試過程中無非上上電,拉下RST,移植中出現空指針等,解決完遇見的問題後camera最終會亮起來,當然之後還需要tunning。這個是個很費力的活,同時很耗時間。以後沒有幹過camera了,個人覺得還是繼續研究linux kernel裏面的爲好,畢竟是做驅動,而不是去爲了camera效果一直去tunning。tunning需要專門的人去做,一旦專門tunning就很難有時間做別的活了。當然有些公司給tunnning camera的待遇很好,即使這樣我也不會動心去深入搞這塊。個人愛好等不一樣,後面一直專注於linux kernel

         所在公司不光做手機還會集成其它的模塊,這樣開發起來相比只做手機的難度大了許多,很多東西自己得去研究。比如集成第三方modem,驅動工程師活也多,雖然一般廠家會提供驅動但是適配到新的平臺難免有許多問題,甚至很嚴重的問題需要分析解決。開發難度上層最大,但是驅動是基礎,所以穩定性等要求比較高。比如集成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很難,後來發現某個大廠這個平臺上都有這個問題,很慶幸自己能解決大廠不能解決的問題。解決後高通支持反過來問如何解決的?倒是很滋潤。對於高通支持工程師我想說,他們支持越來越慢,很多時候完全靠自己,居然有時說沒有機器,但是每次關閉case還是習慣性好評。

         從去年開始可以給公司解決一些比較難的底層問題到現在領導把LCD等外設交給新入職的調試,個人能力慢慢成長,現在還是很關注linux kernel裏面一些驅動等研究,解決一些有難度的問題。雖說說不上精通linux kernel但是可以說非常熟悉,產品底層出現問題可以快速定位分析。個人感覺即使做驅動十年也談不上精通,畢竟linux kerne是個系統內核,精髓在內存管理等等,說精通恐怕只有那些提交linux改進優化系統內核的人。

        前段時間看過別人評價做mtk驅動的,說怎麼怎麼簡單,害了年輕人,個人很慶幸當時入職選擇了做高通驅動。之前也是可以選擇做mtk驅動的或者wince的。再加上這家公司技術實力還是比較牛逼的在業界。自己做高通,就我熟知的kernel代碼確實很漂亮,外國人寫的質量很高,同時設備驅動很豐富,對於剛參加工作的人確實很有益處,學到的非常的多。對於mtk自己沒有做過,雖然別人說怎麼怎麼樣,但是國產的畢竟跑起來的也是很牛逼的。個人覺得知識在於深入研究纔會長能力。以後有機會倒是想多接觸幾個平臺。但是做linux驅動的感覺與平臺關係也不是很大,畢竟Linux大的框架擺在那裏。

    記得剛入職時幹活很急很浮躁,恨不得一下功能就ok。但是現在幹活更多的是享受,一種積累,一種深入發掘的過程。做產品更多的是關注是自己後期試用來找出或者測試出來的問題,同時定位解決問題。

    後續發展方向:研究音頻方面,之前自己也學習了不少,但是沒有親自做過,這些都是別人負責的,自己也會拿手機去debug比如耳機插拔 按鍵 speaker等。這些都是簡單的,軟件上更多的是底層通道切換等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章