伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

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

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

3天內不再提示

U-Boot調試神器:深挖rk平臺atags.c,解決90%的ARM啟動問題

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

掃碼添加小助手

加入工程師交流群

ARM嵌入式開發中,U-Boot作為啟動第一站,其向內核/可信固件(ATF/TOS)傳遞的參數是否正確,直接決定了后續系統能否正常啟動。瑞芯微Rockchip)平臺下的atags.c,正是調試這類參數問題的金鑰匙”——它不僅是ATAGS參數的解析器,更是嵌入式工程師定位啟動故障的核心工具。

本文將結合實際開發板的atags命令輸出,從atags.c的核心邏輯出發,拆解其功能、調試價值,并結合實戰場景講解如何利用該模塊快速解決ARM啟動類問題。

wKgZO2mPvoWALkDEAAAhy-3MKuk600.png

一、ATAGS是什么?atags.c又做了什么?

基礎:ATAGSARM Tags)是ARM架構下U-Boot與內核/下級固件的參數橋梁,類比x86SMBIOS,負責傳遞硬件配置、內存分區、啟動設備等關鍵信息。

瑞芯微定制的atags.c,則是這套橋梁可視化調試工具,核心實現3項功能,結合實際開發板輸出可更直觀理解:

1.結構化解析+打印所有ATAGS參數

遍歷ATAGS_PHYS_BASE(實際開發板為0x001fe000)物理內存區域,解析瑞芯微定制的所有ATAG類型(除常見的串口、DDR內存、TOS/ATF內存等,還包含corepstoreboot1 param等特有Tag),并輸出每個參數的具體值(如實際串口波特率1500000DDR 3個有效bank地址等)。

核心函數:atags_print_all_tags()(遍歷所有Tag+atags_print_tag()(按Tag類型打印字段),實際開發板執行atags命令后,會依次輸出coreserialddr_mem10Tag的完整參數。

2.統計ATAGS內存使用狀態

計算ATAGS區域的總大小、已用大小、可用大小,判斷是否存在內存溢出(參數寫入越界)。結合實際開發板輸出,其ATAGS區域地址范圍為0x001fe000 ~ 0x00200000,總大小0x000020008KB),已用僅0x000003e0,可用空間充足,無溢出風險。

核心函數:atags_stat()——通過累加每個Tag的占用字節(t->hdr.size << 2),輸出內存使用占比,實際輸出中“in use size”“available size”可直接判斷內存狀態。

3.暴露U-Boot命令行調試接口

通過U_BOOT_CMD注冊atags命令,開發者無需修改代碼、無需重新編譯,在U-Boot命令行輸入atags即可觸發上述解析和統計,是無侵入式調試的關鍵。實際開發板的所有ATAGS參數,均通過這一條命令直接獲取,無需額外調試操作。

核心邏輯:do_dump_atags()綁定命令執行邏輯,一行命令就能拿到全量參數+內存狀態,下文所有實戰分析均基于開發板真實atags輸出。

二、為什么atags.c是調試剛需

ARM平臺啟動故障80%以上與U-Boot傳遞的參數不匹配有關,而atags.c正是定位這類問題的終極武器。以下是高頻調試場景及對應的價值:

調試場景

atags.c能解決什么問題?(結合實際板卡)

內核啟動失敗

驗證core(核心參數)、ddr_mem(內存)、rootdev(根設備)是否正確,實際板卡corerootdev0x0,需核對內核配置;

TOS/ATF啟動異常

查看atf_memATF內存,實際phy_addr=0x0size=0x100000)、tos_memTEE/DRM內存)是否地址沖突/配置異常;

串口調試亂碼/無輸出

核對serial Tag:波特率1500000、物理地址0xfeb50000、使能0x1,確認與內核串口配置一致;

啟動設備識別錯誤(EMMC→SD

定位bootdev Tagdevtype=0x2devnum=0x0,對照瑞芯微手冊判斷設備類型是否匹配;

ATAGS參數丟失/溢出

通過實際ATAGS state判斷:已用0x3e0 總大小0x2000,無溢出,若參數丟失可排查Tag寫入邏輯;

固件版本/簽名異常

驗證fwver TagDDRSPLBL31BL32固件版本明確,可核對是否為目標版本;

自定義參數生效驗證

新增/修改RAM分區、boot1參數后,可通過ddr_memboot1 param Tag快速驗證寫入成功;

pstore存儲異常

查看pstore Tagtable參數,實際板卡前5項均為0x8000@0x110000,可驗證持久化存儲配置;

三、實戰:用atags命令解決4類高頻問題(基于真實板卡輸出)

以下結合實際開發板的真實atags輸出,講解4類高頻啟動問題的定位方法,所有操作均基于板卡實際參數,可直接套用。

場景1:內核啟動后內存識別錯誤

操作步驟:

1.U-Boot命令行執行atags,找到[ddr_mem]段:

[ddr_mem]:  magic = 0x54410052   size = 0xc0
  count = 0x3 version = 0x0 bank[0] = 0x0 bank[1] = 0x100000000 bank[2] = 0x2f0000000 bank[3] = 0xf0000000 bank[4] = 0x100000000 bank[5] = 0x10000000 bank[6] = 0x0 bank[7] = 0x0 bank[8] = 0x0 bank[9] = 0x0 bank[10] = 0x0 bank[11] = 0x0 bank[12] = 0x0 bank[13] = 0x0 bank[14] = 0x0 bank[15] = 0x0 bank[16] = 0x0 bank[17] = 0x0 bank[18] = 0x0 bank[19] = 0x0  flags = 0x2 data[0] = 0x0 data[1] = 0x0   hash = 0xb713be00

1.對比內核設備樹(DTS)中的內存配置,重點關注2點:

?板卡count=0x3,說明有3個有效DDR bank,實際有效地址為bank[1]0x100000000)、bank[2]0x2f0000000)、bank[5]0x10000000),若DTS中內存地址/數量與這些值不一致修正U-BootDDR初始化邏輯,重新生成ATAGS參數;

?flags=0x2,需對照瑞芯微rk_atags.hflags的宏定義,確認DDR工作模式是否符合預期,模式錯誤也會導致內存識別失敗。

場景2:內核串口亂碼(U-Boot串口正常)

操作步驟:

1.執行atags找到[serial]段:

[serial]:  magic = 0x54410050   size = 0x30
 version = 0x0  enable = 0x1   addr = 0xfeb50000 baudrate = 1500000  m_mode = 0x0    id = 0x2  res[0] = 0x0  res[1] = 0x0   hash = 0xf968b524

1.排查方向:

?波特率mismatch:板卡U-Boot傳遞的波特率為1500000,若內核cmdline/DTS中串口波特率配置為1152009600等,會直接導致亂碼要么修改U-BootATAGS串口參數,要么調整內核配置,保持一致;

?串口物理地址錯誤:板卡串口基地址為0xfeb50000,需核對SOC手冊,確認該地址對應串口控制器是否為內核配置的串口設備,若地址錯誤需修正U-Boot的串口基地址定義;

?enable=0x1(串口已使能),id=0x2(串口編號),可核對內核是否配置了對應編號的串口設備,避免串口編號不匹配導致無輸出。

場景3TOS/ATF啟動異常

操作步驟:

1.執行atags找到[atf_mem][tos_mem]段:

[atf_mem]:  magic = 0x54410055   size = 0x28
 version = 0x0 phy_addr = 0x0   size = 0x100000  res[0] = 0x0  res[1] = 0x0   hash = 0x1fe8a1b8
[tos_mem]:  magic = 0x54410053   size = 0x7c
 version = 0x10000 tee_mem:      name = tee.mem    phy_addr = 0x8400000      size = 0x1000000     flags = 0x1 drm_mem:      name = drm.mem    phy_addr = 0x0      size = 0x0     flags = 0x0 res[0] = 0x0 res[1] = 0x0 res[2] = 0x0 res[3] = 0x0 res[4] = 0x0 res[5] = 0x0 res[6] = 0x0  res1 = 0x0  hash = 0x949aa8bf

1.排查方向:

?ATF啟動異常:atf_mem.phy_addr=0x0,需確認ATF內存是否配置為自動分配地址未定義,若SOC要求ATF內存必須指定非0物理地址修正U-BootATF內存配置,重新生成ATAGS

?TOS啟動異常:tee_mem.phy_addr=0x8400000size=0x100000016MB),查看該地址范圍是否與ddr_mem中的有效bank地址沖突,若沖突調整TEE內存分區的物理地址;

?drm_mem.phy_addr=0x0size=0x0,說明未配置DRM內存,若板卡需要DRM功能,需在U-Boot中啟用DRM內存配置,否則會導致TOSDRM模塊初始化失敗。

場景4ATAGS內存溢出導致參數丟失

操作步驟:

1.執行atags查看內存統計段:

ATAGSstate:      addr=0x001fe000 ~0x00200000   Totalsize =0x00002000   inuse size =0x000003e0 availablesize =0x00001c20

1.排查方向:

?板卡實際已用大小(0x3e0)遠小于總大小(0x2000),可用空間充足(0x1c20),可排除內存溢出導致的參數丟失問題;

?若后續新增Tag(如自定義RAM分區、新增固件版本信息),導致已用大小接近總大小0x2000 →需擴大ATAGS區域總大小,修改rk_atags.h中的ATAGS_SIZE宏(當前為0x2000),重新編譯U-Boot

?額外檢查:addr=0x001fe000 ~ 0x00200000,需確認該內存區域未被DDRATF等其他模塊占用,避免內存地址沖突導致ATAGS參數寫入失敗。

四、總結:atags.c的調試核心邏輯

瑞芯微atags.c的本質,是將U-Boot寫入物理內存的ATAGS參數可視化”——結合實際開發板情況,無需通過JTAG調試、無需加臨時打印,僅用atags一條命令,就能快速獲取coreserialddr_mem10類核心參數,以及ATAGS內存使用狀態,驗證參數的正確性。

其調試核心邏輯可總結為:

執行atags命令解析ATAGS內存區域(0x001fe000~0x00200000打印10類結構化參數+內存統計對比預期配置(DTS/SOC手冊/內核參數)定位參數不匹配/內存沖突/溢出問題

對于該類開發板而言,掌握atags.c的解析邏輯和atags命令的使用,能大幅降低ARM啟動類問題的調試成本——比如串口亂碼可直接核對serial Tag的波特率和地址,內存識別錯誤可快速查看ddr_membank配置,TOS/ATF異常可定位atf_mem/tos_mem的參數問題,從盲猜問題精準定位,這也是嵌入式開發中工具化調試的核心價值。

最后

嵌入式調試的核心是可視化可驗證,而atags.c正是U-Boot參數調試的可視化工具。本文結合實際開發板的真實atags輸出,完善了所有示例和實戰場景,可直接用于后續板卡調試。若開發板遇到特定啟動問題(如bootdev識別錯誤、pstore存儲異常),可結合本文思路,通過atags命令定位,也歡迎在評論區交流~

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

    關注

    5203

    文章

    20551

    瀏覽量

    335789
  • u-boot
    +關注

    關注

    0

    文章

    135

    瀏覽量

    39853
  • 瑞芯微
    +關注

    關注

    27

    文章

    807

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    U-boot的基本介紹

    從本文開始,將陸續推送“手把手教你移植U-boot”系列文章,目標是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認硬件開發平臺
    發表于 07-14 16:52 ?4225次閱讀
    <b class='flag-5'>U-boot</b>的基本介紹

    U-Boot啟動及移植分析

    bootloader 開發是嵌入式系統必不可少而且十分重要的部分,U-Boot 為功能強大的bootloader 開發軟件。本文詳細分析了U-Boot啟動流程,并結合其源碼,闡述了U-Bo
    發表于 09-01 16:34 ?27次下載

    嵌入式U-BOOT啟動流程及移植

    S3C44B0開發板上的移植方法和步驟。 u-boot是一個功能強大的bootloader開發軟件,適用的CPU平臺
    發表于 02-25 16:00 ?59次下載

    基于ARM9的U-Boot自動識別啟動實現

    嵌入式ARM9系列處理器支持U-Boot從Nor FLASH或者Nand FLASH啟動,也支持U-Boot直接下載到內存中調試運行,根據
    發表于 03-04 16:23 ?91次下載
    基于<b class='flag-5'>ARM</b>9的<b class='flag-5'>U-Boot</b>自動識別<b class='flag-5'>啟動</b>實現

    fireflyFace-RK3399主板U-Boot模式啟動

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-04 08:52 ?5587次閱讀
    fireflyFace-<b class='flag-5'>RK</b>3399主板<b class='flag-5'>U-Boot</b>模式<b class='flag-5'>啟動</b>

    fireflyAIO-3399C主板U-Boot介紹

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-04 10:31 ?2029次閱讀

    fireflyAIO-3288C主板U-Boot介紹

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-16 13:52 ?1796次閱讀
    fireflyAIO-3288<b class='flag-5'>C</b>主板<b class='flag-5'>U-Boot</b>介紹

    fireflyAIO-3288J主板U-Boot使用簡介

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-20 10:06 ?2334次閱讀
    fireflyAIO-3288J主板<b class='flag-5'>U-Boot</b>使用簡介

    fireflyROC-RK3308U-Boot簡介

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-21 11:10 ?2954次閱讀
    fireflyROC-<b class='flag-5'>RK3308U-Boot</b>簡介

    微雪電子AIO-3128C主板U-Boot使用介紹

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-23 16:08 ?2067次閱讀
    微雪電子AIO-3128<b class='flag-5'>C</b>主板<b class='flag-5'>U-Boot</b>使用介紹

    fireflyAIO-3399J主板U-Boot使用介紹

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-24 10:00 ?2605次閱讀
    fireflyAIO-3399J主板<b class='flag-5'>U-Boot</b>使用介紹

    在Vitis中調試ARM可信固件和U-boot

    在本篇博文中,我們將探討如何在 Vitis 中調試 Zynq UltraScale 器件啟動鏡像。這些啟動鏡像包括 ARM 可信固件 (ATF) 和
    的頭像 發表于 08-02 10:14 ?5277次閱讀
    在Vitis中<b class='flag-5'>調試</b><b class='flag-5'>ARM</b>可信固件和<b class='flag-5'>U-boot</b>

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

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

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

    啟動代碼,拆解?RK3506?平臺?U-Boot?重定位的實現邏輯、關鍵步驟與底層原理。 路徑:u-boot/arch/
    的頭像 發表于 11-28 07:05 ?803次閱讀
    深入理解?<b class='flag-5'>RK</b>3506 <b class='flag-5'>U-Boot</b>?重定位:從代碼到原理

    深入解析U-Boot image.cRK平臺鏡像處理核心邏輯

    的SD/NAND/SPI等啟動方式做了專屬適配。本文將拆解image.c的核心邏輯,梳理RK平臺鏡像處理的關鍵流程,幫助開發者理解和調試
    的頭像 發表于 02-24 16:46 ?1635次閱讀
    深入解析<b class='flag-5'>U-Boot</b> image.<b class='flag-5'>c</b>:<b class='flag-5'>RK</b><b class='flag-5'>平臺</b>鏡像處理核心邏輯