国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

解析U-Boot板級核心代碼board.c:從硬件初始化到內核啟動的關鍵一步

jf_44130326 ? 來源:Linux1024 ? 2026-02-03 15:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式開發中,U-Boot作為最常用的啟動加載程序(Bootloader),承擔著"承上啟下"的關鍵角色:它負責初始化硬件、設置啟動環境,最終引導操作系統內核啟動。而board.c作為板級定制的核心文件,是針對具體硬件平臺的"個性化配置中心"。今天我們就通過一份實際的board.c代碼,聊聊它的核心功能、開發者關注的重點,以及這些代碼在U-Boot階段的關鍵意義。

一、board.c:板級硬件的"初始化總控"

wKgZPGkam2yAc_9qAACx-Zni_b4155.png

board.cU-Boot中與具體硬件平臺強相關的代碼文件,幾乎所有針對特定板卡的初始化邏輯、硬件配置、啟動流程定制都會集中在這里。無論是芯片型號識別、內存大小檢測,還是GPIO/ADC等外設的初始化,最終都會通過board.c中的函數落地。

從提供的代碼來看,這份board.c主要面向Rockchip RK3588芯片的板卡,包含了硬件識別、環境變量設置、啟動流程控制等核心功能。我們可以將其核心函數分為幾大模塊:

模塊1:硬件信息識別與環境變量設置

U-Boot需要通過環境變量(如socdram_size)向下游(如內核)傳遞硬件信息,這些信息通常由board.c中的函數采集并設置。(這部分是我自己添加的功能,存在環境變量中,供大家參考)

?SBCID():通過ADC識別硬件版本

這是開發者新增的自定義函數,作用是通過ADC模數轉換器)檢測特定通道的電壓,映射到8個等級并存儲到環境變量SBCID中。

原理:不同硬件版本的板卡可能在ADC引腳接有不同電阻,導致電壓不同,通過電壓范圍匹配即可區分硬件版本。這在多版本板卡的批量生產中非常實用,可自動適配不同硬件配置。

?chips_display():標識芯片型號

直接將環境變量soc設置為"rockchip RK3588",明確告知下游當前使用的芯片型號,方便內核或應用針對性適配。

?dram_sizes():計算并設置內存大小

從全局變量gd->ddr_sizesU-Boot的全局數據結構,存儲DDR信息)中讀取內存總大小,轉換為"GiB"單位并設置到dram_size環境變量。內核啟動時可通過該變量了解內存配置。

?JusticeID():通過GPIO組合識別硬件ID

另一處自定義邏輯:讀取GPIO139140141的輸入電平,組合為3位二進制數(0-7),再映射到特定字符串(如"6""3"等),存儲到JusticeID環境變量。

用途:比ADC識別更直接的硬件區分方式,通過GPIO電平組合可快速定位板卡的具體型號或配置(如是否帶外設、接口類型等)。

模塊2:板級初始化入口函數

U-Boot的初始化流程分為多個階段,board.c中的初始化函數會在特定階段被調用,完成硬件準備。

?rk_board_late_init():板級后期初始化

作為弱函數(__weak),它是板級初始化的"匯總點",調用了前面提到的SBCID()chips_display()等函數,還輸出U-Boot版本。開發者可通過重寫該函數,添加自定義的后期初始化邏輯(如外設使能、狀態檢測)。

?board_init():板級早期初始化

負責調試初始化(board_debug_init())、時鐘探測(clks_probe())、regulators使能(電源管理芯片初始化)等關鍵操作。這是硬件"上電后第一步"的初始化,確保核心外設(如UARTDDR)處于可用狀態。

?board_late_init():系統級后期初始化

rk_board_late_init()更靠后,負責網絡地址(rockchip_set_ethaddr())、序列號(rockchip_set_serialno())設置,以及USB啟動檢測(boot_from_udisk())、充電顯示(charge_display())等。此時硬件已基本就緒,開始為啟動內核做準備。

模塊3:啟動流程控制與內核引導

U-Boot的最終目標是引導內核啟動,board.c中包含大量與啟動流程相關的邏輯。

?boot_from_udisk():從U盤啟動的適配

檢測USB存儲設備,若存在有效鏡像則設置啟動設備為USB,并調整設備樹(FDT)地址,確保內核能從U盤加載。這在系統升級、救磚場景中非常實用。

?env_fixup():環境變量內存地址調整

根據內存大小(如128M/256M)和是否啟用OP-TEE(安全執行環境),動態調整kernel_addr_rramdisk_addr_r等環境變量的地址,避免內存重疊(如內核與ramdisk地址沖突)。

?cmdline_handle():啟動參數(cmdline)處理

根據啟動設備(如SD卡、U盤)和啟動模式(如恢復模式),動態更新bootargs(內核啟動參數)。例如,從U盤恢復時添加usbfwupdate標識,告知內核進入升級模式。

?board_fdt_fixup():設備樹(FDT)修復

設備樹是內核與硬件溝通的"橋梁",該函數負責在啟動前修復設備樹(如CPU兼容性檢查、顯示配置修正),確保內核拿到的設備樹與實際硬件匹配。

模塊4:其他輔助功能

?rockchip_set_ethaddr()rockchip_set_serialno():生成并設置以太網MAC地址和設備序列號,確保網絡唯一性和設備可標識性。若硬件中未預存(如燒錄到OTP/EFUSE),則自動生成隨機值并存儲。

?board_rng_seed():為內核提供隨機數種子,用于Linux內核的隨機數初始化(尤其Android 14+ GKI要求必須提供),增強系統安全性。

?autoboot_command_fail_handle():自動啟動失敗時的處理邏輯,例如啟動失敗后進入Fastboot模式,方便開發者調試或重刷系統。

二、開發者為什么關注board.c

對于嵌入式開發者來說,board.c是硬件與軟件的"連接點",其重要性體現在三個方面:

1.硬件初始化的"最后一公里",獲取基本信息

芯片手冊中定義的外設(如GPIOADC)需要通過board.c中的代碼實際使能和配置。例如,若ADC通道未正確初始化,SBCID()就無法讀取電壓;若GPIO未設置為輸入模式,JusticeID()就無法獲取正確電平。

2.啟動流程的"定制化入口"

不同產品的啟動需求不同:有的需要優先從U盤啟動,有的需要根據硬件版本加載不同設備樹,這些都需要在board.c中通過函數(如boot_from_udisk()env_fixup())定制。

3.問題排查的"關鍵線索"

若內核啟動失敗(如內存識別錯誤、外設不可用),很大概率是board.c中的初始化邏輯有問題。例如,dram_sizes()計算錯誤會導致內核看到的內存大小與實際不符,進而引發崩潰。

三、這些代碼在U-Boot階段的意義

U-Boot的核心使命是"為內核啟動鋪路",而board.c中的代碼正是完成這一使命的核心工具:

?硬件就緒:通過board_init()等函數初始化CPUDDR、時鐘、電源等核心硬件,確保內核啟動時所有外設處于可用狀態。

?環境統一:通過環境變量(如socdram_size)向內核傳遞硬件信息,避免內核重復檢測硬件,提高啟動效率。

?流程可控:通過boot_from_udisk()cmdline_handle()等函數,支持靈活的啟動策略(如多設備啟動、恢復模式),提升產品的易用性和可維護性。

四、自定義代碼的參考價值

文中的SBCID()JusticeID()是開發者新增的邏輯,這類代碼的參考意義在于:

?硬件差異化處理:在多版本板卡(如同一型號的不同配置)中,通過ADCGPIO快速區分硬件,自動適配驅動或配置,減少代碼冗余。

?低成本識別方案:無需額外的存儲芯片(如EEPROM),利用現有ADC/GPIO實現硬件識別,降低硬件成本。

?可擴展性示范:展示了如何在U-Boot中添加自定義邏輯并通過環境變量向下傳遞,為其他定制需求(如外設檢測、狀態上報)提供參考。

總結

board.c作為U-Boot的板級核心文件,是硬件初始化的"總導演"、啟動流程的"控制器"、硬件信息的"傳遞者"。理解其函數邏輯,不僅能幫助開發者快速定位啟動問題,更能根據產品需求定制靈活的啟動策略。而其中的自定義代碼(如硬件識別邏輯),則展示了嵌入式開發中"用軟件適配硬件差異"的實用思路,值得大家參考借鑒。

下一次調試U-Boot啟動問題時,不妨從board.c入手——這里大概率藏著解決問題的關鍵!



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5198

    文章

    20449

    瀏覽量

    334012
  • 內核
    +關注

    關注

    4

    文章

    1468

    瀏覽量

    42874
  • u-boot
    +關注

    關注

    0

    文章

    135

    瀏覽量

    39773
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    U-Boot在AT91RM9200上的移植及啟動分析

    移植之前,先來了解U-Boot啟動過程。U-Boot啟動過程可以分成3個階段。(1)在FLASH中運行匯編程序,進行基本
    發表于 03-16 11:00

    基于開發U-Boot移植

    經有了CPU相關代碼。2.下一步就是查看板相關代碼了。款主流CPU發布的時候,廠商
    發表于 01-14 14:31

    開發上移植U-Boot

    經有了CPU相關代碼。2.下一步就是查看板相關代碼了。款主流CPU發布的時候,廠商
    發表于 01-14 14:36

    【OK210試用體驗】u-boot篇 -- u-boot一步定制

    【OK210試用體驗】u-boot篇 -- u-boot一步定制 u-boot單板的自定義,
    發表于 09-07 11:38

    【OK210試用體驗】u-boot篇 -- u-boot啟動流程總結

    S5PV210上電后,先運行iROM里的 BL0 段代碼,執行完對CPU的系列初始化后,會SD/MMC/NorFlash/NandFLash...里拷貝扇區1的
    發表于 09-08 22:45

    U-BOOT啟動流程分享

    語言不能直接訪問,C運行之前需要準備堆棧),C階段兩次搬移:u-boot自搬移,內核搬移兩次初始化:基本
    發表于 01-18 10:17

    u-boot簡介

    點。 U-Boot是BootLoader的種,是在操作系統內核運行之前運行。可以初始化硬件設備、建立內存空間映射圖,從而將系統的軟
    發表于 10-14 11:17 ?3949次閱讀

    U-Boot啟動內核的工作過程詳細說明

    U-Boot 啟動內核的過程可以分為兩個階段,兩個階段的功能如下:(1)第階段的功能 硬件設備初始化
    發表于 12-28 08:00 ?3次下載
    <b class='flag-5'>U-Boot</b><b class='flag-5'>啟動</b><b class='flag-5'>內核</b>的工作過程詳細說明

    u-boot在匯編啟動階段的相關操作介紹

    相關操作 _start開始,u-boot會根據board定義做些平臺相關的初始化工作或者是
    的頭像 發表于 12-07 11:22 ?1762次閱讀

    深入解析U-Boot TPL代碼:嵌入式啟動的“第棒”背后的秘密

    在嵌入式系統啟動過程中,按下電源鍵操作系統開始運行,中間藏著系列精密的初始化步驟。今天我們就來拆解 Rockchip 平臺
    的頭像 發表于 02-05 14:07 ?1059次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b> TPL<b class='flag-5'>代碼</b>:嵌入式<b class='flag-5'>啟動</b>的“第<b class='flag-5'>一</b>棒”背后的秘密

    深入解析U-Boot核心文件board_f.c:知識點、調試要點與開發價值

    在嵌入式系統開發中,U-Boot 作為應用最廣泛的引導程序,其底層初始化邏輯直接決定了硬件啟動的穩定性與可靠性。
    的頭像 發表于 02-03 15:38 ?744次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b>文件<b class='flag-5'>board_f.c</b>:知識點、調試要點與開發價值

    解析Rockchip平臺U-Boot核心文件:boot_rkimg.c到底做了什么?

    在嵌入式開發中,U-Boot 作為引導程序的 “中流砥柱”,負責初始化硬件、加載內核啟動系統。對于 Rockchip 平臺的設備(如常見的
    的頭像 發表于 02-03 15:29 ?743次閱讀
    <b class='flag-5'>解析</b>Rockchip平臺<b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b>文件:<b class='flag-5'>boot_rkimg.c</b>到底做了什么?

    深入理解?RK3506 U-Boot?重定位:代碼原理

    ?U-Boot?代碼初始加載地址(通常是片內?ROM?或?Flash)復制運行效率更高的片外?RAM,再切換執行環境
    的頭像 發表于 11-28 07:05 ?590次閱讀
    深入理解?RK3506 <b class='flag-5'>U-Boot</b>?重定位:<b class='flag-5'>從</b><b class='flag-5'>代碼</b><b class='flag-5'>到</b>原理

    深入解析rk平臺Android Bootloader核心代碼啟動流程AVB驗證

    作為Android設備啟動的第道“閘門”,Bootloader(以U-Boot為主)承擔著初始化硬件、加載
    的頭像 發表于 01-22 07:06 ?266次閱讀
    深入<b class='flag-5'>解析</b>rk平臺Android Bootloader<b class='flag-5'>核心</b><b class='flag-5'>代碼</b>:<b class='flag-5'>從</b><b class='flag-5'>啟動</b>流程<b class='flag-5'>到</b>AVB驗證

    深入解析RK3588 U-Boot文件:evb_rk3588.c核心邏輯拆解

    在嵌入式開發領域,瑞芯微RK3588憑借超強的算力、豐富的接口和廣泛的場景適配性,成為高端邊緣計算、消費電子項目的熱門選擇。而U-Boot作為嵌入式系統的“第道門”,負責硬件初始化
    的頭像 發表于 02-24 15:24 ?768次閱讀
    深入<b class='flag-5'>解析</b>RK3588 <b class='flag-5'>U-Boot</b><b class='flag-5'>板</b><b class='flag-5'>級</b>文件:evb_rk3588.<b class='flag-5'>c</b><b class='flag-5'>核心</b>邏輯拆解