Qcom Platform開機流程概述

前言

高通芯片平臺種類衆多涵蓋低端到高端的各種檔次種類繁多:低端有諸如8909,中端有8916、8929、8937等,高端的有8953、8953、8953pro、8993,8996、8996pro。從存儲介質上講,從早期emmc慢慢發展到emcp最終由向ufs轉化的趨勢,運行位數更是從早期的32位全體過渡到64位地址總線。科技發展日新月異成果遍地!

也正是由於技術和平臺的差異較大,很難通過一篇文章來窮盡所有高通平臺的流程。好在所有的chip在boot時有很大的通性,便於舉一反三,故本文將以2017年正在使用的Qcom平臺爲例,帶領大家從宏觀上把握開機流程的核心。

子系統模塊架構

要了解高通的平臺,必須先了解下芯片中集成了那些子系統(SubSystem)。與Intel的做法不同,高通芯片中所包含的子系統數量多,集成度高,這些子系統都有各自獨立的cpu,只要在開機過程中通過主cpu子系統(APPS)引導/燒錄進對應的firmware,就可以地獨立運行起來。

在較新的高通芯片中較常見到的子系統(SubSystem)有下面這些:

SubSystem Function
APPS (Application Processer Subsystem) 主CPU
RPM (Resource Power Manager) 電源管理模塊(帶獨立cpu)
Venus 高通的圖像處理模塊
LPASS (LowPower Audio Subsystem)音頻處理模塊
WCNSS (Pronto) Wifi模塊
Modem Modem處理器或稱之爲baseband
TZ (TrustZone) Arm平臺負責Security的Cpu,主系統可通過scm call與之通訊獲取想要的數據

Boot流程

既然芯片中集成了這麼多顆cpu,講解開機流程的核心就演變爲講解主cpu是如何逐步引導子cpu完整boot的流程了。

  1. 按PowerKey引導主CPU Reset
  2. cpu抓取存取器(emmc or ufs)中已預先燒入的sbl1 fw 執行。
    • 將sbl1fw加載到L2緩存
    • 將rpm的初始化引導代碼(存放在sbl1中)加載到rpm子系統中
    • jump到L2中執行sbl1(因爲DDR還沒初始化,所以此時在cache中運行最爲方便)
  3. sbl1開始初始化DDR爲後續大內存的使用代碼提供運行環境
  4. sbl1將TZ img加載到DDR中
  5. sbl1將RPM的firmware(img)導入rpm子系統中
  6. sbl1將HLOS APPSBL Image(指的是lk即little kernel,有人習慣稱之爲aboot或是大家嘗叫的BootLoader;其中的HLOS是Qcom常用的說法,指的是High-Level Operationg System)引導進DDR
  7. sbl1將執行權轉交給TZ,完成系統安全環境(TrustZone)的建立、xpu的初始化和fuse的代碼支援(security boot)
  8. TZ開始設置memory和io接口的訪問權限,並通知RPM子系統開始運行
  9. TZ將引導執行HLOS APPSBL(LK)代碼,並轉移執行權到LK
  10. LK根據此時用戶的按鍵行爲(是否長按音量鍵等)決定下一步的運行模式。

    Boot模式一般有如下三種: 
    1:Normal Boot(boot進kernel)
    2:Fastboot Mode
    3:Recovery Mode
    
    我們這裏將只分析Normal Boot的情況
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  11. LK加載Kernel

  12. LK通過執行SCM call將執行權轉交給kernel
  13. Kernel通過PIL(Peripheral image loader)將MBA(Modem Boot Authenticator)加載到DDR
  14. Kernel開始warm reset(warm reset DDR 不會掉電,內存數據保留) Modem的Cpu以便MBA開始boot流程,等待Modem完整Firmware的到來
  15. Kernel通過PIL加載Modem img到DDR
  16. Modem cpu開始正常啓動
  17. Kernel通過PIL加載WCNSS img到DDR,然後warm reset wcnss子系統以便WCNSS img被正常執行
  18. Kernel通過PIL加載LPASS img到DDR,然後warm reset LPASS子系統以便LPASS img被正常執行
  19. Kernel通過PIL加載並執行Venus img
  20. kernel繼續正常boot,調用init和zygote將android系統調用起來

這樣一來,所有的子系統都正常開始執行,並且我們有了一個security的環境(TZ),來保證與用戶隱私和權限相關的data會非常安全。

總結

上面的流程是基於中高端高通平臺的通用流程,有些細節在不同平臺上有細小的區別故沒有特意展開。在8996平臺上,高通引入了xbl這樣的新機制替代了sbl1,但他們功能類似,行爲相仿。

每個子系統由於都是獨立的cpu,可能有些讀者會產生這樣的疑惑:萬一某個子系統運行不正常,那Kernel如何才能對他們進行有效監控和管理呢?高通引入了QMI(Qcom Message Interface)的接口,讓各個子系統可以通過其進行較爲高效的數據交換,當然這些數據是可以包含系統日誌(log)的,這樣我們就可以對其進行一定程度上的管理和監控了。當然,我們還有一系列的driver節點,可以通過其對子系統進行reset和clock的管理。最最重要的是,每個子系統都提供了一個sub-system restart的監控節點,這樣只要某個子系統異常宕機(例如modem偶爾重啓,用戶可能看到短暫的無服務),我們可以通過modem的引導程序,將modem子系統的整個運行內存狀態完整的dump出來,這樣就可以分析crash前的所有變量和堆棧狀態了。

瞭解高通平臺的boot流程,對做bsp的同仁來說是十分有必要的,我們bring up某個新平臺的EVB主板時,有了基礎知識才能很找到不開機時的問題點,才能儘快進行針對性的debug。

順便分享點經驗:電池電量,電池id電阻,DDR是否有部分虛焊點是常常導致無法開機的元兇。這些問題可以通過log或在edl mode下燒入不同的firehouse來快速驗證。

歡迎大家提出寶貴意見和建議,共同成長。

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章