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

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

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

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

玩轉U-Boot bdinfo:嵌入式bsp開發(fā)者的定制、擴展與裁剪實戰(zhàn)指南

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

掃碼添加小助手

加入工程師交流群

作為嵌入式開發(fā)者,U-Boot是我們調試、適配板卡的核心工具,而bdinfo命令更是板級信息調試的利器”——它能直觀打印內(nèi)存布局、Flash信息、網(wǎng)絡配置、時鐘頻率等核心參數(shù)。但原廠的bdinfo.c往往是大而全的通用實現(xiàn),適配自研板卡時,要么冗余打印拖慢調試效率,要么缺少我們需要的自定義硬件信息。

今天就結合bdinfo.c的核心邏輯,手把手教你做功能裁剪、擴展、私有定制,讓bdinfo完全貼合自研板卡的調試需求!

wKgZO2mRDtmAPNCKAAARj2YXOY8495.png

一、先理清:bdinfo.c核心價值與定制思路

bdinfo.c的核心是實現(xiàn)bdinfo命令,通過封裝各類打印函數(shù)(print_num/print_mhz/print_eth等),基于bd_t(板級信息結構體)和全局gd指針,按不同架構(ARM/RISC-V/PPC等)差異化打印硬件參數(shù)。

我們的定制思路圍繞3個核心需求:

?裁剪:刪掉自研板卡用不到的打印邏輯,減小U-Boot鏡像體積;

?擴展:新增自研板卡的自定義硬件信息打?。ㄈ缬布姹尽?/span>PMIC狀態(tài));

?定制:修改輸出格式,適配自研調試工具(如JSON格式、固定分隔符)。

二、實戰(zhàn)1:功能裁剪——精簡冗余打印,減小鏡像體積

自研板卡往往是極簡設計:比如只有單網(wǎng)口、無外置Flash、不需要多DRAM Bank打印,這些冗余代碼不僅增加鏡像體積,還會在調試時輸出無關信息,干擾判斷。

適用場景

?自研ARM板卡只有eth0,不需要eth1-eth5打印;

?板卡無Flash芯片,無需Flash起始地址/大小打印;

?不需要LCD/VIDEO相關的幀緩沖(FB base)打印。

裁剪步驟(以ARM架構為例)

步驟1:精簡以太網(wǎng)打印

原廠代碼會遍歷eth0-eth5,但我們只有單網(wǎng)口,直接修改print_eth_ip_addr函數(shù),只保留eth0

staticinlinevoidprint_eth_ip_addr(void){#ifdefined(CONFIG_CMD_NET) // 只保留eth0,刪除eth1-eth5的條件編譯print_eth(0);printf("IP addr   = %sn",env_get("ipaddr"));#endif}

步驟2:刪除Flash相關打印

如果板卡無Flash,直接注釋/刪除print_bi_flash函數(shù)的調用(以ARM架構的do_bdinfo為例):

staticintdo_bdinfo(cmd_tbl_t*cmdtp,intflag,intargc,char*constargv[]){bd_t*bd = gd->bd;print_num("arch_number",bd->bi_arch_number);print_bi_boot_params(bd);print_bi_dram(bd); // 【裁剪】刪除Flash打印(板卡無Flash) // print_bi_flash(bd);#ifdefCONFIG_SYS_MEM_RESERVE_SECURE // ... 原有邏輯保留#endif // ... 其余邏輯不變}

步驟3:關閉LCD/VIDEO相關打印

如果板卡無顯示模塊,刪除幀緩沖打?。?/span>

#ifdefined(CONFIG_LCD) || defined(CONFIG_VIDEO) // 【裁剪】注釋掉FB base打印// print_num("FB base ", gd->fb_base);#endif

裁剪核心原則

?優(yōu)先用條件編譯宏(如CONFIG_MY_BOARD_NO_FLASH)封裝裁剪邏輯,便于后續(xù)開關:

#ifndefCONFIG_MY_BOARD_NO_FLASHprint_bi_flash(bd);#endif

?只刪除打印調用,不刪除底層函數(shù)(如print_bi_flash),避免影響其他架構/板卡復用。

三、實戰(zhàn)2:功能擴展——新增自定義板級信息打印

這是最常用的定制場景:比如打印自研板卡的硬件版本、PMIC電壓、傳感器ID、自定義保留內(nèi)存區(qū)域等。

適用場景

自研ARM板卡需要打印:

1.硬件版本號(存儲在gd全局變量的自定義字段);

2.PMIC電源管理芯片)的工作電壓;

3.自研的安全分區(qū)內(nèi)存地址。

擴展步驟

步驟1:定義自定義輔助打印函數(shù)

bdinfo.c中新增適配自定義信息的打印函數(shù)(復用原廠的格式化風格,保持一致性):

// 新增:打印硬件版本__maybe_unusedstaticvoidprint_board_version(constchar*name, u32 version){ // 格式對齊原廠:左對齊12字符,后接版本號(十進制)printf("%-12s= V%02d.%02dn", name, (version>>8)&0xFF, version&0xFF);}// 新增:打印PMIC電壓(單位:mV)__maybe_unusedstaticvoidprint_pmic_voltage(constchar*name, u32 voltage_mv){printf("%-12s= %d mVn", name, voltage_mv);}// 新增:打印自定義保留內(nèi)存__maybe_unusedstaticvoidprint_custom_reserve_mem(constchar*name,ulongstart,ulongsize){print_num(name, start);print_num("-> size", size);}

步驟2:在對應架構的do_bdinfo中添加調用

ARM架構為例,在do_bdinfo函數(shù)中新增自定義打?。ńㄗh放在原有打印邏輯的末尾,便于查看):

staticintdo_bdinfo(cmd_tbl_t*cmdtp,intflag,intargc,char*constargv[]){bd_t*bd = gd->bd;// ... 原有打印邏輯(arch_number、DRAM、eth等)保留 // 【擴展】新增自定義硬件信息打印 // 1. 打印硬件版本(假設gd->arch.board_version是自定義字段) print_board_version("Board Ver", gd->arch.board_version); // 2. 打印PMIC核心電壓(模擬讀取PMIC寄存器  u32 core_volt =read_pmic_reg(PMIC_CORE_VOLT_REG);// 自研PMIC讀取函數(shù) print_pmic_voltage("PMIC Core", core_volt); // 3. 打印安全分區(qū)內(nèi)存 print_custom_reserve_mem("Secure Area",0x90000000,0x100000);print_baudrate();// ... 其余原有邏輯保留return0;}

步驟3:用條件編譯封裝擴展邏輯

為了便于開關自定義打印,新增全局宏CONFIG_MY_BOARD_CUSTOM_BDINFO

#ifdefCONFIG_MY_BOARD_CUSTOM_BDINFO // 自定義打印邏輯 print_board_version("Board Ver", gd->arch.board_version); print_pmic_voltage("PMIC Core", core_volt); print_custom_reserve_mem("Secure Area",0x90000000,0x100000);#endif

然后在板卡的configs/my_board_defconfig中添加:

CONFIG_MY_BOARD_CUSTOM_BDINFO=y

四、實戰(zhàn)3:私有定制——適配自研調試工具

原廠bdinfo輸出是純文本,如果需要對接自研的調試解析工具(如自動解析參數(shù)的腳本),可以定制輸出格式(如JSON、固定分隔符)。

適用場景

bdinfo輸出JSON格式,便于上位機腳本解析內(nèi)存、波特率、自定義硬件版本等信息。

定制步驟

步驟1:修改核心打印函數(shù)為JSON格式

print_num為例,修改為JSON鍵值對格式:

__maybe_unusedstaticvoidprint_num(constchar*name, ulong value){ // 原廠格式:printf("%-12s= 0x%08lXn", name, value); // 定制為JSON格式(注意逗號分隔,最后一個字段無逗號)printf(" "%s": "0x%08lX",n", name, value);}// 同步修改自定義打印函數(shù)為JSON格式__maybe_unusedstaticvoidprint_board_version(constchar*name, u32 version){printf(" "%s": "V%02d.%02d"n", name, (version>>8)&0xFF, version&0xFF);}

步驟2:包裹整體輸出為JSON結構

do_bdinfo函數(shù)開頭/結尾添加JSON首尾標識:

staticintdo_bdinfo(cmd_tbl_t*cmdtp,intflag,intargc,char*constargv[]){bd_t*bd = gd->bd; // JSON開頭 printf("{n");print_num("arch_number",bd->bi_arch_number);print_bi_boot_params(bd);print_bi_dram(bd); // ... 其余打印邏輯(含自定義) print_board_version("Board Ver", gd->arch.board_version); // JSON結尾 printf("}n");return0;}

定制后輸出效果

{"arch_number":"0x00000000","boot_params":"0x80000100","DRAM bank":"0x00000000","-> start":"0x80000000","-> size":"0x10000000","Board Ver":"V01.02"}

五、定制擴展的最佳實踐

1.優(yōu)先用條件編譯,避免硬改:所有定制邏輯都用CONFIG_MY_BOARD_XXX宏封裝,便于不同板卡復用、開關;

2.復用原廠函數(shù)風格:新增打印函數(shù)時,對齊原廠的格式化規(guī)則(如%-12s左對齊),保持輸出可讀性;

3.利用__weak函數(shù)擴展:如果需要修改架構級的核心邏輯(如PPCboard_detail),優(yōu)先用__weak重寫,而非直接修改原廠函數(shù):

// 自研板卡重寫board_detailvoidboard_detail(void){ print_num("Custom Param",0x12345678);}

4.編譯測試驗證

?編譯:make my_board_defconfig && make,確保無編譯錯誤;

?燒錄:將新U-Boot燒錄到板卡;

?驗證:執(zhí)行bdinfo命令,檢查打印內(nèi)容是否符合預期。

六、總結

bdinfo.cU-Boot板級調試的窗口,通過裁剪冗余代碼、擴展自定義信息、定制輸出格式,既能減小U-Boot鏡像體積,又能讓調試信息精準匹配自研板卡的需求。

核心要點回顧:

1.裁剪:聚焦自研板卡的硬件特性,刪除無關打印,用宏控制開關;

2.擴展:復用原廠打印風格,新增自定義輔助函數(shù),在對應架構的do_bdinfo中調用;

3.定制:適配調試工具的輸出格式(如JSON),兼顧可讀性和自動化解析。

掌握這些技巧,讓bdinfo通用工具變成貼合你自研板卡的專屬調試助手!

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

    關注

    5198

    文章

    20434

    瀏覽量

    333883
  • u-boot
    +關注

    關注

    0

    文章

    135

    瀏覽量

    39738
  • 命令
    +關注

    關注

    5

    文章

    755

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    嵌入式系統(tǒng)中U-Boot 基本特點及其移植方法

    在介紹U-Boot 基本特點的基礎上,結合U-Boot 移植經(jīng)歷,以MPC8xx 和嵌入式Linux 為背景,分析、探討U-Boot 的移植方法、過程與相關移植要點, 并給出一些具體配
    發(fā)表于 04-15 09:25 ?17次下載

    嵌入式系統(tǒng)中U-Boot 基本特點及其移植方法

    在介紹U-Boot 基本特點的基礎上,結合U-Boot 移植經(jīng)歷,以MPC8xx 和嵌入式Linux 為背景,分析、探討U-Boot 的移植方法、過程與相關移植要點, 并給出一些具體配
    發(fā)表于 05-16 14:52 ?12次下載

    U-Boot的啟動及移植分析

    bootloader 開發(fā)嵌入式系統(tǒng)必不可少而且十分重要的部分,U-Boot 為功能強大的bootloader 開發(fā)軟件。本文詳細分析了U-Boo
    發(fā)表于 09-01 16:34 ?27次下載

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

    摘要:嵌入式系統(tǒng)一般沒有通用的bootloader,u-boot是功能強大的bootloader開發(fā)軟件,但相對也比較復雜。文中對u-boot的啟動流程作了介紹,詳細給出了
    發(fā)表于 02-25 16:00 ?59次下載

    基于u-boot嵌入式系統(tǒng)實驗板BSP研究

    在介紹BSP概念和功能的基礎上,討論了u-boot的移植過程和關鍵環(huán)節(jié)。系統(tǒng)啟動試驗表明移植后的U-BOOT實現(xiàn)了BSP的功能
    發(fā)表于 05-26 15:47 ?33次下載
    基于<b class='flag-5'>u-boot</b>的<b class='flag-5'>嵌入式</b>系統(tǒng)實驗板<b class='flag-5'>BSP</b>研究

    U-Boot在基于BF561的嵌入式Linux系統(tǒng)上的移植

    嵌入式開發(fā)人員應該在了解U-Boot的工作機理、移植條件后,根據(jù)目標板和具體情況靈活裁減U -Boot以提高操作系統(tǒng)移植的穩(wěn)定性,縮短移植周期,降低產(chǎn)品成本,為后續(xù)
    發(fā)表于 06-28 11:22 ?1581次閱讀
    <b class='flag-5'>U-Boot</b>在基于BF561的<b class='flag-5'>嵌入式</b>Linux系統(tǒng)上的移植

    u-boot學習指南

    u-boot 是免費的,我們做嵌入式的一般只需要使用 u-boot 即可,但如果你想成為一個比較強的嵌入式系統(tǒng)工程師,而且還做了自己開發(fā)板,
    發(fā)表于 11-17 15:54 ?2次下載

    嵌入式Linux開發(fā)實用教程(試用)

    高超的技術使得 U-Boot 能夠非常容易地被移植 到多種嵌入式 CPU 中, 支持多種嵌入式操作系統(tǒng)內(nèi)核的引導。不少 U-Boot 源碼就是 linux。
    發(fā)表于 04-28 16:30 ?2次下載

    如何在U-Boot中實現(xiàn)對Yaffs鏡像的設計?

    U-Boot是目前廣泛使用的嵌入式操作系統(tǒng)通用引導程序,具有功能豐富強大,支持多種操作系統(tǒng)和CPU體系,易于功能擴展和移植,源碼開放等多種優(yōu)點。U-Boot,全稱 Universal
    的頭像 發(fā)表于 08-29 05:02 ?4369次閱讀
    如何在<b class='flag-5'>U-Boot</b>中實現(xiàn)對Yaffs鏡像的設計?

    嵌入式Linux系統(tǒng)移植開發(fā)-(1)基于Yocto構建嵌入式u-boot,內(nèi)核,文件系統(tǒng)

    基于Yocto構建嵌入式u-boot,內(nèi)核,文件系統(tǒng)Yocto是什么?簡單地概括,它是一個工具,可以用來構建u-boot,kernel,文件系統(tǒng),交叉編譯工具鏈,等等。Yocto提供了一套完整的全面
    發(fā)表于 11-01 17:38 ?14次下載
    <b class='flag-5'>嵌入式</b>Linux系統(tǒng)移植<b class='flag-5'>開發(fā)</b>-(1)基于Yocto構建<b class='flag-5'>嵌入式</b><b class='flag-5'>u-boot</b>,內(nèi)核,文件系統(tǒng)

    U-Boot架構淺析

    導讀:嵌入式Linux系統(tǒng)搭建,bootloader是必不可少的一環(huán),而U-Boot已成嵌入式Linux事實標準。所以較為深入的分析U-Boot的設計,對于更...
    發(fā)表于 02-07 11:56 ?7次下載
    <b class='flag-5'>U-Boot</b>架構淺析

    創(chuàng)建自定義的u-boot命令

    為什么會有這篇文章,因為小生被u-boot源碼的設計所吸引了(源碼對命令的處理過程)。自定義u-boot命令屬于u-boot源碼的開發(fā)技術啦,可能u
    的頭像 發(fā)表于 08-08 14:46 ?1733次閱讀

    tiny4412編譯與移植U-Boot

    U-Boot 是一個主要用于嵌入式系統(tǒng)的引導加載程序, U-Boot本質是一個裸機程序,是一種普遍用于嵌入式系統(tǒng)中的開源的Bootloader,作用是用來引導操作系統(tǒng),以及給
    的頭像 發(fā)表于 08-31 08:59 ?3197次閱讀
    tiny4412編譯與移植<b class='flag-5'>U-Boot</b>

    嵌入式系統(tǒng)中u-boot和bootloader詳解

    嵌入式軟件工程師聽說過 u-boot 和 bootloader,但很多工程師依然不知道他們到底是啥。
    發(fā)表于 10-20 13:12 ?2606次閱讀

    Linux U-Boot開發(fā)指南

    介紹 U-Boot 的編譯打包、基本配置、常用命令的使用、基本調試方法等, 為 U-BOOT 的移植及應用開發(fā)提供了基礎。
    的頭像 發(fā)表于 03-06 10:28 ?2433次閱讀
    Linux <b class='flag-5'>U-Boot</b><b class='flag-5'>開發(fā)指南</b>