海思uboot啟動流程詳細分析(一)

来源:https://www.cnblogs.com/linhaostudy/archive/2019/04/03/10649273.html
-Advertisement-
Play Games

第一階段 start.S 首先我們可以在u boot.lds中看到 ,即指定了入口 ,`_start start.S`的最開始; 1. reset 在 中的 normal_start_flow: / set stack for C code / ldr x0, =(CONFIG_SYS_INIT_S ...


第一階段 start.S

首先我們可以在u-boot.lds中看到ENTRY(_start),即指定了入口_start_start也就是整個start.S的最開始;

1. reset

arch\arm\cpu\armv8\hi3559av100中的start.S

註意x30在ARMV8中代表lr寄存器


reset:
    /*
     * Could be EL3/EL2/EL1, Initial State:
     * Little Endian, MMU Disabled, i/dCache Disabled
     */
    adr    x0, vectors
    switch_el x1, 3f, 2f, 1f
3:  msr    vbar_el3, x0
    mrs    x0, scr_el3
    orr    x0, x0, #0xf             /* SCR_EL3.NS|IRQ|FIQ|EA */
    msr    scr_el3, x0
    msr    cptr_el3, xzr            /* Enable FP/SIMD */
#ifdef COUNTER_FREQUENCY
    ldr    x0, =COUNTER_FREQUENCY
    msr    cntfrq_el0, x0           /* Initialize CNTFRQ */
#endif
    b      0f
2:  msr    vbar_el2, x0
    mov    x0, #0x33ff
    msr    cptr_el2, x0             /* Enable FP/SIMD */
    b      0f
1:  msr    vbar_el1, x0
    mov    x0, #3 << 20
    msr    cpacr_el1, x0            /* Enable FP/SIMD */
0:
    /*
     * Cache/BPB/TLB Invalidate
     * i-cache is invalidated before enabled in icache_enable()
     * tlb is invalidated before mmu is enabled in dcache_enable()
     * d-cache is invalidated before enabled in dcache_enable()
     */

    /*
     *  read system register REG_SC_GEN2
     *  check if ziju flag
     */
    ldr    x0, =SYS_CTRL_REG_BASE
    ldr    w1, [x0, #REG_SC_GEN2]
    ldr    w2, =0x7a696a75         /* magic for "ziju" */
    cmp    w1, w2
    bne    normal_start_flow
    mov    x1, sp                  /* save sp */
    str    w1, [x0, #REG_SC_GEN2]  /* clear ziju flag */

adr x0, vectors,其中的vectors代表了異常向量表

主要做瞭如下事情:

1)reset SCTRL寄存器

具體可參考reset_sctrl函數,由CONFIG_SYS_RESET_SCTRL控制,一般不需要打開。該配置項的解釋如下:

Reset the SCTRL register at the very beginning of execution to avoid interference from stale mappings set up by early firmware/loaders/etc.

http://lists.denx.de/pipermail/u-boot/2015-April/211147.html

2)根據當前的EL級別,配置中斷向量、MMU、Endian、i/d Cache等。

3)配置ARM的勘誤表

具體可參考apply_core_errata函數,由CONFIG_ARM_ERRATA_XXX控制,在項目的初期,可以不打開,後續根據實際情況打開)。

2. normal_start_flow流程

這裡是正常啟動流程

normal_start_flow:
    /* set stack for C code  */
    ldr    x0, =(CONFIG_SYS_INIT_SP_ADDR)
    bic    sp, x0, #0xf            /* 16-byte alignment for ABI compliance */

    bl      uart_early_init
    adr     x0, Str_SystemSartup
    bl      uart_early_puts
    ldr  x0, =0x1202008c
    ldr w0, [x0]
    bl uart_early_put_hex
    /* enable I-Cache  */
    bl     icache_enable

1)設置代碼的堆棧
2.)跳轉到uart_early_init

因為uart_early_init是全局的偽彙編指令(在uart.S中定義),所以在start.S中也可以使用到

3)聲明一個字元串Str_SystemSartup
4)使能icache

因為bne normal_start_flow是不跳轉回來的,所以會繼續向下執行

3. running_addr_check流程

判斷是否進入not_ddr_init中,不需要DDR初始化,直接copy到DDR中

check_boot_mode:
    ldr    x0, =SYS_CTRL_REG_BASE
    ldr    w0, [x0, #REG_SYSSTAT]
    lsr    w6, w0, #4
    and    w6, w6, #0x3
    cmp    w6, #BOOT_FROM_EMMC  //判斷是不是EMMC啟動
    bne    ufs_boot //如果不是,則進入ufs_boot

4. ziju_flow流程

自舉模式從這裡我可以推斷出,晶元的啟動分為兩種,一種是自舉模式也就是本地的spiflash或nand或emmc等啟動,另一種就是pcie啟動模式。不同啟動模式對應不同的啟動流程。但不同啟動模式代碼是相互交織的,需要分清楚!

1) 初始化PLL和DDRC控制器和管腳復用情況。

/* init PLL/DDRC/pin mux/... */
    ldr r0, _blank_zone_start
    ldr r1, _TEXT_BASE
    sub r0, r0, r1
    ldr r1, =RAM_START_ADRS
    add r0, r0, r1
    mov r1, #0x0                 /* flags: 0->normal 1->pm */
    bl  init_registers           /* init PLL/DDRC/... */

bl init_registers這個函數是初始化一些寄存器,這些寄存器分了很多,包括中斷、網路、哈希功能形式的寄存器,初始化的意思就是給一個值,但這值一般沒什麼意義,具體的寄存器,後面會再進行配置!

2) start_ddr_training

/* DDR training:DR佈線,完全按等長約束就沒有ddr training的說法。
當佈線去掉等長約束或放寬約束條件,就要做ddr training,以保證時序的完整性,使信號的建立&保持時間視窗一致。ddr training是調整Addr/Cmd信號對CLK,DQ信號對DQS的延時。由於沒做等長約束,信號有長,有短,就會導致信號有快,慢之差(信號在1000mil走線耗時約160~180ps,相對FR-4的板材),ddr training就是找到一套參數,使信號的建立與保持時間充足。並保存且寫到配置中。*/

3) pcie_slave_boot

5. jump_to_ddr

自舉模式省略了一些PCIE判斷的情況的解釋,我也沒怎麼看懂

jump_to_ddr:
    adr    x0, _start_armboot
    ldr    x30,[x0]
    ret

開始進入跳轉到C語言階段

總結

  1. 關cache,關mmu,SVC模式
  2. 檢測是不是自舉模式還是pcie啟動,也包括是冷啟動還是熱啟動
  3. 串口初始化
  4. DDR初始化和DDR training
  5. 正常啟動時,會檢測啟動方式,對代碼進行相應的拷貝,重定位
  6. 設置堆棧
  7. 清bss段
  8. 跳轉到第二階段,即C語言階段

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux常見系統故障 1.修複MBR扇區故障 2.修複GRUB引導故障 3./etc/inittab文件丟失 4.遺忘root用戶密碼 5.修複文件系統 6.磁碟資源耗盡故障 一、修複MBR扇區故障 1.關機添加一塊硬碟,開機查看硬碟設備分區列表,是否存在/dev/sdb設備信息 2.對新硬碟分區 ...
  • 使用Expand命令行可以在電腦沒有安裝Windows操作系統的情況下應用批處理文件和腳本: 雖然有多個基於Windows的工具可以壓縮和解壓縮文件(包括WinZip和WinRAR),但是必須有一個可以工作的Windows操作系統才能使用它們。 Expand工具用來壓縮的Wndows CAB文件中 ...
  • 我在使用SDL2的時候,遇到undefined reference to `SDL_Init'的問題,只要使用SDL2相關的函數,就會報函數未定義。後來百度到一篇文章https://blog.csdn.net/hank12580/article/details/45949995,經過測試可以使用,原 ...
  • 我在使用SDL2的時候遇到始終找不到頭文件的問題,到處百度然後我嘗試使用#include<SDL2/SDL.h>編譯通過了,那麼我很顯然我之前設置的環境變數應該是沒有生效的,後面在返回來研究下為啥沒有生效,linux的基礎知識太薄弱了,應該好好補習一下。 ...
  • 今天打算學習littlev GUI,使用Ubuntu來實現模擬,然後在安裝SDL2的時候,始終因為依賴關係導致安裝失敗,我嘗試手動去安裝那些有依賴關係的包發現根本不可行,然後我百度上也沒有找到合適的法子,但是看有的網友說是因為源的問題,我思考了下覺得這個說法有一定道理,然後我嘗試切換源,我測試了16 ...
  • 1. 檢查系統自帶的Mysql,並卸載自帶的版本 2. 卸載系統自帶的mysql及其依賴 3. 給CentOS添加rpm源,並且選擇較新的源 1)下載rpm包 2)安裝本地mysql源 3)驗證是否安裝成功 4)修改預設版本為5.7 註:如下是截取的老徐之前文章 -》原文 http://istest ...
  • HTTP/HTTPS抓包工具--Fiddler Fiddler[ˈfɪdlə(r)] 1. HTTP代理神器Fiddler Fiddler是一款強大Web調試工具,它能記錄所有客戶端和伺服器的HTTP請求。 Fiddler啟動的時候,預設IE的代理設為了127.0.0.1:8888,而其他瀏覽器是需 ...
  • 參考資料: RAID data striping spanned volume 從raid0到raid7,raid陣列各級別介紹 本文所使用的圖片來源於互聯網,若有侵權,煩請聯繫,謝謝。 簡介 RAID出現的目的是為了數據的冗餘,或者性能的提升,或者兩者兼顧。早期想實現這樣的功能,可能需要購買一些基 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...