91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

wKgZPGkam2yAc_9qAACx-Zni_b4155.png

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

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

模塊1:硬件信息識別與環(huán)境變量設(shè)置

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

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

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

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

?chips_display():標(biāo)識芯片型號

直接將環(huán)境變量soc設(shè)置為"rockchip RK3588",明確告知下游當(dāng)前使用的芯片型號,方便內(nèi)核或應(yīng)用針對性適配。

?dram_sizes():計算并設(shè)置內(nèi)存大小

從全局變量gd->ddr_sizesU-Boot的全局?jǐn)?shù)據(jù)結(jié)構(gòu),存儲DDR信息)中讀取內(nèi)存總大小,轉(zhuǎn)換為"GiB"單位并設(shè)置到dram_size環(huán)境變量。內(nèi)核啟動時可通過該變量了解內(nèi)存配置。

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

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

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

模塊2:板級初始化入口函數(shù)

U-Boot的初始化流程分為多個階段,board.c中的初始化函數(shù)會在特定階段被調(diào)用,完成硬件準(zhǔn)備。

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

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

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

負(fù)責(zé)調(diào)試初始化(board_debug_init())、時鐘探測(clks_probe())、regulators使能(電源管理芯片初始化)等關(guān)鍵操作。這是硬件"上電后第一步"的初始化,確保核心外設(shè)(如UART、DDR)處于可用狀態(tài)。

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

rk_board_late_init()更靠后,負(fù)責(zé)網(wǎng)絡(luò)地址(rockchip_set_ethaddr())、序列號(rockchip_set_serialno())設(shè)置,以及USB啟動檢測(boot_from_udisk())、充電顯示(charge_display())等。此時硬件已基本就緒,開始為啟動內(nèi)核做準(zhǔn)備。

模塊3:啟動流程控制與內(nèi)核引導(dǎo)

U-Boot的最終目標(biāo)是引導(dǎo)內(nèi)核啟動,board.c中包含大量與啟動流程相關(guān)的邏輯。

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

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

?env_fixup():環(huán)境變量內(nèi)存地址調(diào)整

根據(jù)內(nèi)存大?。ㄈ?/span>128M/256M)和是否啟用OP-TEE(安全執(zhí)行環(huán)境),動態(tài)調(diào)整kernel_addr_r、ramdisk_addr_r等環(huán)境變量的地址,避免內(nèi)存重疊(如內(nèi)核與ramdisk地址沖突)。

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

根據(jù)啟動設(shè)備(如SD卡、U盤)和啟動模式(如恢復(fù)模式),動態(tài)更新bootargs(內(nèi)核啟動參數(shù))。例如,從U盤恢復(fù)時添加usbfwupdate標(biāo)識,告知內(nèi)核進(jìn)入升級模式。

?board_fdt_fixup():設(shè)備樹(FDT)修復(fù)

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

模塊4:其他輔助功能

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

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

?autoboot_command_fail_handle():自動啟動失敗時的處理邏輯,例如啟動失敗后進(jìn)入Fastboot模式,方便開發(fā)者調(diào)試或重刷系統(tǒng)。

二、開發(fā)者為什么關(guān)注board.c?

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

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

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

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

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

3.問題排查的"關(guān)鍵線索"

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

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

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

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

?環(huán)境統(tǒng)一:通過環(huán)境變量(如soc、dram_size)向內(nèi)核傳遞硬件信息,避免內(nèi)核重復(fù)檢測硬件,提高啟動效率。

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

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

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

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

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

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

總結(jié)

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

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



聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5198

    文章

    20434

    瀏覽量

    333885
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1467

    瀏覽量

    42863
  • u-boot
    +關(guān)注

    關(guān)注

    0

    文章

    135

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

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

    基于開發(fā)U-Boot移植

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

    開發(fā)上移植U-Boot

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

    【OK210試用體驗】u-boot篇 -- u-boot進(jìn)一步定制

    【OK210試用體驗】u-boot篇 -- u-boot進(jìn)一步定制 u-boot單板的自定義,
    發(fā)表于 09-07 11:38

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

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

    U-BOOT啟動流程分享

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

    u-boot簡介

    點。 U-Boot是BootLoader的種,是在操作系統(tǒng)內(nèi)核運行之前運行??梢?b class='flag-5'>初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟
    發(fā)表于 10-14 11:17 ?3949次閱讀

    U-Boot啟動內(nèi)核的工作過程詳細(xì)說明

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

    u-boot在匯編啟動階段的相關(guān)操作介紹

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

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

    在嵌入式系統(tǒng)啟動過程中,按下電源鍵操作系統(tǒng)開始運行,中間藏著系列精密的初始化步驟。今天我們就來拆解 Rockchip 平臺
    的頭像 發(fā)表于 02-05 14:07 ?1050次閱讀
    深入<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:知識點、調(diào)試要點與開發(fā)價值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為應(yīng)用最廣泛的引導(dǎo)程序,其底層初始化邏輯直接決定了硬件啟動的穩(wěn)定性與可靠性。
    的頭像 發(fā)表于 02-03 15:38 ?738次閱讀
    深入<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>:知識點、調(diào)試要點與開發(fā)價值

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

    在嵌入式開發(fā)中,U-Boot 作為引導(dǎo)程序的 “中流砥柱”,負(fù)責(zé)初始化硬件、加載內(nèi)核啟動系統(tǒng)。對于 Rockchip 平臺的設(shè)備(如常見的
    的頭像 發(fā)表于 02-03 15:29 ?736次閱讀
    <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?代碼初始加載地址(通常是片內(nèi)?ROM?或?Flash)復(fù)制運行效率更高的片外?RAM,再切換執(zhí)行環(huán)境
    的頭像 發(fā)表于 11-28 07:05 ?576次閱讀
    深入理解?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設(shè)備啟動的第道“閘門”,Bootloader(以U-Boot為主)承擔(dān)著初始化硬件、加載
    的頭像 發(fā)表于 01-22 07:06 ?232次閱讀
    深入<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核心邏輯拆解

    在嵌入式開發(fā)領(lǐng)域,瑞芯微RK3588憑借超強的算力、豐富的接口和廣泛的場景適配性,成為高端邊緣計算、消費電子項目的熱門選擇。而U-Boot作為嵌入式系統(tǒng)的“第道門”,負(fù)責(zé)硬件初始化、
    的頭像 發(fā)表于 02-24 15:24 ?729次閱讀
    深入<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>邏輯拆解