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

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

wKgZO2mRDtmAPNCKAAARj2YXOY8495.png

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

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

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

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

?擴(kuò)展:新增自研板卡的自定義硬件信息打印(如硬件版本、PMIC狀態(tài));

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

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

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

適用場(chǎng)景

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

?板卡無Flash芯片,無需Flash起始地址/大小打?。?/span>

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

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

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

原廠代碼會(huì)遍歷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相關(guān)打印

如果板卡無Flash,直接注釋/刪除print_bi_flash函數(shù)的調(diào)用(以ARM架構(gòu)的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打?。ò蹇oFlash) // print_bi_flash(bd);#ifdefCONFIG_SYS_MEM_RESERVE_SECURE // ... 原有邏輯保留#endif // ... 其余邏輯不變}

步驟3:關(guān)閉LCD/VIDEO相關(guān)打印

如果板卡無顯示模塊,刪除幀緩沖打印:

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

裁剪核心原則

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

#ifndefCONFIG_MY_BOARD_NO_FLASHprint_bi_flash(bd);#endif

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

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

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

適用場(chǎng)景

自研ARM板卡需要打?。?/span>

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

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

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

擴(kuò)展步驟

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

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

// 新增:打印硬件版本__maybe_unusedstaticvoidprint_board_version(constchar*name, u32 version){ // 格式對(duì)齊原廠:左對(duì)齊12字符,后接版本號(hào)(十進(jìn)制)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:在對(duì)應(yīng)架構(gòu)的do_bdinfo中添加調(diào)用

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

staticintdo_bdinfo(cmd_tbl_t*cmdtp,intflag,intargc,char*constargv[]){bd_t*bd = gd->bd;// ... 原有打印邏輯(arch_number、DRAM、eth等)保留 // 【擴(kuò)展】新增自定義硬件信息打印 // 1. 打印硬件版本(假設(shè)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:用條件編譯封裝擴(kuò)展邏輯

為了便于開關(guān)自定義打印,新增全局宏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

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

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

適用場(chǎng)景

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

定制步驟

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

print_num為例,修改為JSON鍵值對(duì)格式:

__maybe_unusedstaticvoidprint_num(constchar*name, ulong value){ // 原廠格式:printf("%-12s= 0x%08lXn", name, value); // 定制為JSON格式(注意逗號(hào)分隔,最后一個(gè)字段無逗號(hào))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結(jié)構(gòu)

do_bdinfo函數(shù)開頭/結(jié)尾添加JSON首尾標(biāo)識(shí):

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結(jié)尾 printf("}n");return0;}

定制后輸出效果

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

五、定制擴(kuò)展的最佳實(shí)踐

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

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

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

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

4.編譯測(cè)試驗(yàn)證

?編譯:make my_board_defconfig && make,確保無編譯錯(cuò)誤;

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

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

六、總結(jié)

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

核心要點(diǎn)回顧:

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

2.擴(kuò)展:復(fù)用原廠打印風(fēng)格,新增自定義輔助函數(shù),在對(duì)應(yīng)架構(gòu)的do_bdinfo中調(diào)用;

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

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

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

    關(guān)注

    5198

    文章

    20442

    瀏覽量

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

    關(guān)注

    0

    文章

    135

    瀏覽量

    39747
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    755

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

    U-Boot的啟動(dòng)及移植分析

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

    嵌入式U-BOOT的啟動(dòng)流程及移植

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

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

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

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

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

    u-boot學(xué)習(xí)指南

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

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

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

    如何在U-Boot中實(shí)現(xiàn)對(duì)Yaffs鏡像的設(shè)計(jì)?

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

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

    基于Yocto構(gòu)建嵌入式u-boot,內(nèi)核,文件系統(tǒng)Yocto是什么?簡(jiǎn)單地概括,它是一個(gè)工具,可以用來構(gòu)建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構(gòu)建<b class='flag-5'>嵌入式</b><b class='flag-5'>u-boot</b>,內(nèi)核,文件系統(tǒng)

    U-Boot架構(gòu)淺析

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

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

    為什么會(huì)有這篇文章,因?yàn)樾∩?b class='flag-5'>u-boot源碼的設(shè)計(jì)所吸引了(源碼對(duì)命令的處理過程)。自定義u-boot命令屬于u-boot源碼的開發(fā)技術(shù)啦,可能u
    的頭像 發(fā)表于 08-08 14:46 ?1736次閱讀

    tiny4412編譯與移植U-Boot

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

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

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

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

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