1. 程式人生 > >第一期 前言 《手機就是開發板》

第一期 前言 《手機就是開發板》

https://blog.csdn.net/aggresss/article/details/53364324#commentBox

  前幾天翻抽屜發現了一堆舊手機,不禁感慨,從2009年開始使用android系統的手機到現在,平均每十個月就換一個手機,因為工作原因很熟悉nand和eMMC儲存器的工作原理,知道手機內的個人資訊即使被刪掉也是可以輕易恢復的,所以出於隱私保護的因素每一箇舊手機我都妥善的收藏著。手機已經逐漸成為我們的一個器官,每天和他打交道的時間是最多的,同時它也是一個消耗品,一個手機陪伴我們的時間也就是一到兩年的時間。面對一堆舊手機我突然來了一個靈感,既然它們已經不再是儲存個人資訊的載體,何不折騰一下,把手機當作開發板,細細的研究一下它的工作原理。當然把一個已經是產品的手機當作開發板還是有點挑戰性的,畢竟略微有一點逆向工程的意思。
        還記得第一次給手機刷機是2012年的事了,手機的型號是HTC_G11,當時手機訊號不好,泡在論壇上有人說刷一下基帶就好了,於是找了篇刷機的帖子按照上面說的一部一部的操作:解鎖bootloader,刷recovery,刷booting,刷system,刷userdata,刷cache,刷基帶。刷了一個通宵,刷完特有成就感,雖然今天看了沒有什麼技術含量,但畢竟大體瞭解了一下手機的系統構成。當然刷機後問題解決了也就沒有再去研究過,因為工作上的事情太操心了。
        說幹就幹,對於一個開發板,我覺得只要有Datasheet文件和JTAG除錯介面這兩種輸出其他的就都不是問題了。因為Jtag是基於SOC底層的控制方式,所以只要手機可以通過Jtag方式除錯,也就可以作為開發板來使用啦。各種論壇潛水後,我在一個維修手機的論壇發現了HTC_G11手機Jtag的接法:

        

        於是,迅速連線焊點,將對應訊號接入JLINK偵錯程式,然後使用OpenOCD進行scan_chain,如下圖這樣,使用開關電源調到4v給手機供電,這裡說一下手機電池電量的原理,電池的電量就是通過電壓表現出來的從3.7v到4.2v對應0%到100%的電量,所以如果手機不用電池供電,只要通過對接3.7v到4.2v之間的直流電就能開機,還有一些手機有電池型別檢測端子和溫度反饋檢測端子,再根據定義將相應端子對地接一定阻值的電阻就能開機。

        結果很悲劇,OpenOCD沒有任何反饋,我想這裡面一定是有某些黑科技在,比如開機要按某些特定鍵啟用JTAG介面之類的,最後發現手機的JTAG除錯有專門的裝置,比如riff box(當面三星的字型檔門很多都是用它就磚的)還有國產的 東海智慧天驕王,這些廠商已經將手機JTAG研究的很透徹,而且支援的手機型號也在不斷的更新中。JLINK和OpenOCD的組合可能不太支援,也可能理論上支援但需要基於原始碼做一些修改,所以對於Jtag的嘗試就先到這裡了,如果想研究Jtag刷手機的話可以考慮入手一個支援手機晶片的Jtag偵錯程式。
        放棄Jtag除錯手機最大的影響就是對手機Bootloader的除錯會遇到很大的屏障,因為bootloader的除錯需要更底層的Jtag作為保障,不過經過我一番研究發現,手機內要研究的東西還挺多,android在設計的時候加入了recovery的概念,這樣就弱化了bootloader的重要性,而且bootloader都是有手機晶片生產商提供基礎原始碼,這些都是不公開的,也就是說先去研究其他的問題,暫且放棄bootloader的研究。
        總要給一個想法找一個方向,定一個目標。經過1個星期的不斷摸索,最終確定了《手機就是開發板》的研究方向:
        1.Android Kernel 驅動移植;
        2.Android HAL 移植;
        3.Andorid JNI 和 APP 初級掌握;
        4.Andorid ROM 移植和定製;


        通過將手機作為實驗物件,實踐動手操作來對以上提到的研究方向進行學習就是我想出《手機就是開發板》這個命題的核心思想。因為這幾年我越來越體會到,沒有輸出的學習是徒勞的,所以我提倡找到實踐途徑再去學習的方式。
手機的選擇也是很關鍵的,現在手機的晶片方案大體就這幾家:
        高通 Qualcomm MSM系列;
        聯發科 MediaTek MT系列;
        三星 sumsung Exynos系列;
        英偉達 Nvidia Tegra系列;
        海思 Hisilicon kylin系列;
        還有一些小眾的品牌 intel、全志、展訊、Mstar、TI等等。

        每一系列的晶片都有自己的特點,這裡我選擇普及量最高的兩款作為實踐物件,分別是高通的MSM8974(驍龍800),聯發科的MT6582。這兩種晶片對應的手機很多,我這裡有兩款舊手機正好對應,分別是小米3和聯想A850,下面是它們的照片。

下面制定一下學習路線。
        第一步,學習AOSP(Android Open Source Project)相關的內容,通過google官方文件,和google提供的模擬器學習android原始碼的編譯流程,學習編譯系統,在模擬器上對上面提到的四個研究方向做一遍實踐;
        第二步,因為CyanogenMod對小米3提供官方支援,所以在小米3上對上面提到的四個研究方向再進行一遍實機操作;
        第三步,因為聯發科將開源這部分任務留給了手機供應商,所以AOSP和CyanogenMod對MTK的手機都不提供官方支援,所以我們可以通過MT6582的手機來進行系統移植的實踐,最終自己動手將android的系統移植到MTK方案的手機上;
        第四步,在自己定製的android系統上,選擇一些硬體模組,比如GPS,sensor,camera,NFC,在這些方面從底層做一些修改並做出可以實現特殊功能的APP。

        通過這四步走和四個研究方向,預計用時60天,實現對android系統的初步瞭解,程度上比 會刷機 更深入一點。當然,需要一點基礎,需要你在Windows和linux系統的語境間自由切換,不存在系統鴻溝,瞭解一點C/C++和JAVA基礎,系統版本選擇Android6.0,對應的CyanogenMod版本為CM13。
        《手機就是開發板》的代號為 PHDemo 是phone demo 的縮寫。
        這裡特別說明一下,我實驗中使用的手機都是所有資訊已經匯出,不再進行實際使用的手機,也就是說任何實驗造成的資料和硬體的損壞都不會造成實際損失。在這裡強烈建議各位,不要拿正在使用的手機做實驗,並且出於安全考慮,不建議在使用中的手機中刷非官方ROM,不建議獲取root許可權。
        每一期提到的原始碼和工具都可以在我的github連結上找到:https://github.com/aggresss/PHDemo