哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

深度解析?RK?平臺?U-Boot?環(huán)境變量(env):原理、配置與實(shí)戰(zhàn)

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-04-27 07:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

環(huán)境變量(env)是U-Boot的核心配置機(jī)制,無需重新編譯即可靈活調(diào)整啟動(dòng)參數(shù)。在Rockchip(RK)平臺上,環(huán)境變量不僅繼承了U-Boot的通用特性,還針對RK芯片架構(gòu)做了大量定制化設(shè)計(jì)。本文將從通用概念、RK平臺特殊處理、工作流程、調(diào)試方法等維度,全面拆解RK平臺環(huán)境變量的底層邏輯與實(shí)操技巧。

一、環(huán)境變量的通用概念

1.1什么是環(huán)境變量?

環(huán)境變量是U-Boot中以“鍵值對”形式存儲的配置信息,示例如下:

bootdelay=3bootcmd=mmc dev0; fatload mmc00x40400000 Image; booti0x40400000

這些變量在U-Boot啟動(dòng)時(shí)加載,直接控制啟動(dòng)流程、設(shè)備信息、內(nèi)存布局等核心配置。

1.2環(huán)境變量的存儲結(jié)構(gòu)

環(huán)境變量在存儲介質(zhì)上的結(jié)構(gòu)定義于include/environment.h,核心結(jié)構(gòu)如下:

typedefstructenvironment_s{ uint32_t  crc;    /* CRC32校驗(yàn) */#ifdefCONFIG_SYS_REDUNDAND_ENVIRONMENT unsignedcharflags;  /* 冗余標(biāo)志 */#endif unsignedchardata[ENV_SIZE];/* 實(shí)際數(shù)據(jù) */}env_t;

數(shù)據(jù)區(qū)存儲規(guī)則

?以結(jié)尾的字符串列表,格式為name=value;

?整個(gè)列表以雙結(jié)束。

1.3環(huán)境變量的存儲位置

U-Boot支持多類存儲介質(zhì),RK平臺常用的有:

?MMC/eMMC(最主流);

?SPI Flash(SPI NOR/NAND);

?NAND Flash(大容量存儲);

?FAT文件系統(tǒng)(以文件形式存儲);

?NOWHERE(僅內(nèi)存運(yùn)行,不持久化)。

二、RK平臺的特殊處理

2.1架構(gòu)專屬配置

RK平臺在u-boot/env/Kconfig中設(shè)有專屬配置段,定義環(huán)境變量的核心參數(shù):

ifARCH_ROCKCHIPconfig ENV_OFFSET  hex"Environment offset" default0x3f8000/* 默認(rèn)偏移地址 */config ENV_SIZE  hex"Environment size" default0x8000 /* 32KB大小 */ifENVF  config ENV_OFFSET_REDUND  config ENV_NAND_OFFSET  config ENV_NOR_OFFSET  ...endifendif

2.2分區(qū)布局規(guī)范

RK平臺默認(rèn)分區(qū)布局定義于include/configs/rockchip-common.h,核心片段如下:

#define PARTS_RKIMG  "uuid_disk=${uuid_gpt_disk};" "name=uboot,start=8MB,size=4MB,uuid=${uuid_gpt_loader2};" "name=trust,size=4M,uuid=${uuid_gpt_atf};" "name=misc,size=4MB,uuid=${uuid_gpt_misc};" "name=resource,size=16MB,uuid=${uuid_gpt_resource};" "name=kernel,size=32M,uuid=${uuid_gpt_kernel};" "name=boot,size=32M,bootable,uuid=${uuid_gpt_boot};"  ...

關(guān)鍵結(jié)論:環(huán)境變量通常存儲在uboot分區(qū)的0x3f8000偏移位置(4MB - 32KB)。

2.3 RK3576內(nèi)存布局定制

針對RK3576芯片,include/configs/rk3576_common.h定義了內(nèi)存布局相關(guān)環(huán)境變量:

#defineENV_MEM_LAYOUT_SETTINGS "scriptaddr=0x40500000" "pxefile_addr_r=0x40600000" "fdt_addr_r=0x48300000" "kernel_addr_r=0x40400000" "kernel_addr_c=0x45480000" "ramdisk_addr_r=0x4a200000"

2.4啟動(dòng)設(shè)備自動(dòng)檢測

RK平臺內(nèi)置智能啟動(dòng)設(shè)備檢測邏輯,自動(dòng)識別啟動(dòng)介質(zhì):

#defineRKIMG_DET_BOOTDEV  "rkimg_bootdev=" "if mmc dev 1 && rkimgtest mmc 1; then "   "setenv devtype mmc; setenv devnum 1; echo Boot from SDcard;" "elif mmc dev 0; then "   "setenv devtype mmc; setenv devnum 0;" "elif mtd_blk dev 0; then "   "setenv devtype mtd; setenv devnum 0;" "elif rknand dev 0; then "   "setenv devtype rknand; setenv devnum 0;" "elif rksfc dev 0; then "   "setenv devtype spinand; setenv devnum 0;" "elif rksfc dev 1; then "   "setenv devtype spinor; setenv devnum 1;" "else;"   "setenv devtype ramdisk; setenv devnum 0;" "fi; "

2.5多啟動(dòng)方式支持

RK平臺支持Android、Fit、RKP、Distro等多種啟動(dòng)方式:

#define RKIMG_BOOTCOMMAND  "boot_android${devtype}${devnum};" "boot_fit;" "bootrkp;" "run distro_bootcmd;"

三、環(huán)境變量的工作流程

3.1整體流程

wKgZO2nunHaADmIRAAeqRjIdgAA229.png

3.2 MMC存儲詳細(xì)流程

RK平臺最常用的MMC存儲流程如下:

3.3核心代碼路徑

wKgZO2nunHaAXqpyAAFXSSjzsjw336.png

初始化核心邏輯(env/env.c):

intenv_init(void){ structenv_driver *drv = env_driver_lookup_default(); intret = -ENOENT;
 if(!drv)   return-ENODEV; if(drv->init)    ret = drv->init(); if(ret == -ENOENT) {   // 使用默認(rèn)環(huán)境    gd->env_addr = (ulong)&default_environment[0];    gd->env_valid = ENV_VALID;   return0;  } returnret;}

環(huán)境驅(qū)動(dòng)查找邏輯

staticstructenv_driver*env_driver_lookup(enumenv_location loc) { structenv_driver*drv; constintn_ents =ll_entry_count(structenv_driver, env_driver); structenv_driver*entry;
  drv =ll_entry_start(structenv_driver, env_driver); for(entry = drv; entry != drv + n_ents; entry++) {   if(loc == entry->location)     returnentry;  } returnNULL;}

四、環(huán)境變量的使用與調(diào)試

4.1常用命令

功能 命令示例
查看所有環(huán)境變量 printenv/env
查看特定變量 printenv bootcmd
設(shè)置環(huán)境變量 setenv bootcmd "mmc dev 0; fatload mmc 0 0x40400000 Image; booti 0x40400000"
保存環(huán)境變量 saveenv
刪除環(huán)境變量 setenv bootcmd
恢復(fù)默認(rèn)環(huán)境 env default -a

4.2調(diào)試技巧

1.啟用調(diào)試日志:編譯時(shí)開啟Kconfig調(diào)試選項(xiàng),或在源碼中添加printf輸出;

2.檢查環(huán)境有效性

if(gd->env_valid == ENV_INVALID) { printf("使用默認(rèn)環(huán)境n");}

3.手動(dòng)讀取環(huán)境數(shù)據(jù)

# 從MMC讀取環(huán)境數(shù)據(jù)到內(nèi)存0x40500000mmcread0x405000000x3f80000x10# 查看內(nèi)存數(shù)據(jù)md0x40500000

4.CRC校驗(yàn)驗(yàn)證:環(huán)境數(shù)據(jù)前4字節(jié)為CRC32值,可手動(dòng)計(jì)算驗(yàn)證。

4.3常見問題排查

問題現(xiàn)象 可能原因 解決方法
保存環(huán)境變量后重啟丟失 1. saveenv執(zhí)行失敗
2.存儲介質(zhì)故障
3.偏移地址配置錯(cuò)誤
1.檢查saveenv輸出日志
2.驗(yàn)證CONFIG_ENV_OFFSET配置
3.測試存儲介質(zhì)讀寫功能
啟動(dòng)提示bad CRC 1.環(huán)境數(shù)據(jù)損壞
2.首次啟動(dòng)無環(huán)境數(shù)據(jù)
執(zhí)行env default -a恢復(fù)默認(rèn)環(huán)境
環(huán)境變量過大無法保存 變量數(shù)量/長度超出ENV_SIZE限制 1.清理無用變量
2.增大CONFIG_ENV_SIZE配置

4.4關(guān)鍵配置選項(xiàng)

配置項(xiàng) 作用 默認(rèn)值(RK平臺)
CONFIG_ENV_IS_IN_MMC 啟用MMC存儲環(huán)境變量 開啟
CONFIG_ENV_OFFSET 環(huán)境變量存儲偏移 0x3f8000
CONFIG_ENV_SIZE 環(huán)境變量存儲空間大小 0x8000(32KB)
CONFIG_SYS_MMC_ENV_DEV 指定MMC設(shè)備號 根據(jù)硬件配置
CONFIG_ENV_OFFSET_REDUND 冗余環(huán)境備份偏移 可選配置

五、RK專屬:ENVF環(huán)境片段機(jī)制

ENVF(Environment Fragment)是RK平臺特有的環(huán)境變量增強(qiáng)機(jī)制,允許將環(huán)境變量存儲在專用分區(qū),實(shí)現(xiàn)動(dòng)態(tài)覆蓋與合并。

5.1核心配置

config ENVF bool"Environment fragment is store in envf partition"  dependsonENV_IS_NOWHEREconfig ENVF_LIST string"Specific environments white list of env fragment" default"blkdevparts mtdparts sys_bootargs app reserved"

5.2典型使用場景

?動(dòng)態(tài)配置分區(qū)信息;

?存儲產(chǎn)品定制化參數(shù);

?跨固件版本共享核心配置。

六、實(shí)戰(zhàn)案例:RK3576自定義環(huán)境變量

6.1修改默認(rèn)環(huán)境(編譯期)

在板級配置文件include/configs/rk3576_common.h中添加自定義變量:

#define CONFIG_EXTRA_ENV_SETTINGS  ENV_MEM_LAYOUT_SETTINGS "partitions="PARTS_RKIMG  ROCKCHIP_DEVICE_SETTINGS  RKIMG_DET_BOOTDEV  BOOTENV "my_custom_var=hello_rk3576" "bootargs_append=console=ttyS2,1500000n8"

6.2運(yùn)行時(shí)修改(命令行)

# 設(shè)置自定義啟動(dòng)參數(shù)setenvbootargs console=ttyS2,1500000n8 root=/dev/mmcblk0p7 rootwait rw# 保存配置saveenv# 重啟生效reset

七、總結(jié)

RK平臺的U-Boot環(huán)境變量機(jī)制,在通用U-Boot基礎(chǔ)上做了三大核心增強(qiáng):

1.多介質(zhì)適配:完美支持MMC、SPI、NAND等主流存儲;

2.智能啟動(dòng):自動(dòng)檢測啟動(dòng)設(shè)備,適配多場景啟動(dòng)需求;

3.靈活擴(kuò)展:通過ENVF機(jī)制實(shí)現(xiàn)環(huán)境變量動(dòng)態(tài)管理。

掌握上述知識點(diǎn),既能快速定位環(huán)境變量相關(guān)問題,也能根據(jù)項(xiàng)目需求靈活定制啟動(dòng)配置,充分發(fā)揮RK平臺的硬件特性。

參考文件

?u-boot/env/env.c:核心環(huán)境管理邏輯;

?u-boot/env/mmc.c:MMC存儲實(shí)現(xiàn);

?u-boot/include/environment.h:環(huán)境數(shù)據(jù)結(jié)構(gòu)定義;

?u-boot/include/configs/rockchip-common.h:RK通用配置;

?u-boot/include/configs/rk3576_common.h:RK3576專屬配置;

?u-boot/env/Kconfig:環(huán)境變量配置選項(xiàng)。

審核編輯 黃宇

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

    關(guān)注

    0

    文章

    137

    瀏覽量

    39949
  • Rockchip
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    吃透RK3576 U-Boot.map文件!嵌入式開發(fā)調(diào)試、性能優(yōu)化、代碼裁剪全攻略

    “寶藏文件”,解鎖調(diào)試、分析、優(yōu)化的全套實(shí)戰(zhàn)技巧。 一、U-Boot.map?是什么? U-Boot.map?是?U-Boot?編譯鏈接階段生成的內(nèi)存布局映射文件,記錄了可執(zhí)行文件在內(nèi)
    的頭像 發(fā)表于 04-27 07:11 ?465次閱讀
    吃透<b class='flag-5'>RK</b>3576 <b class='flag-5'>U-Boot</b>.map文件!嵌入式開發(fā)調(diào)試、性能優(yōu)化、代碼裁剪全攻略

    飛凌嵌入式ElfBoard-環(huán)境變量之刪除清空環(huán)境變量environ

    (\"PATH\")); } return 0;}2)代碼解析在清理環(huán)境變量之前先獲取一次PATH環(huán)境變量的值,然后通過將 environ 賦值為 NULL 立即清空當(dāng)前進(jìn)程的所有環(huán)境變量
    發(fā)表于 03-26 10:23

    飛凌嵌入式ElfBoard-環(huán)境變量之刪除清空環(huán)境變量clearenv

    有的場景需要清空環(huán)境變量,然后再重新進(jìn)行構(gòu)建,如果是使用unsetent的話會比較繁瑣;clearenv() 將當(dāng)前進(jìn)程的環(huán)境變量列表清空,使得后續(xù)的環(huán)境變量訪問(如getenv())返回 NULL
    發(fā)表于 03-26 10:22

    飛凌嵌入式ElfBoard-環(huán)境變量之添加修改環(huán)境變量setenv

    been unset8)代碼解析使用 setenv(\"MY_VAR\", \"12345\", 1) 設(shè)置環(huán)境變量 MY_VAR 的值為 \"
    發(fā)表于 03-26 09:24

    飛凌嵌入式ElfBoard-環(huán)境變量之添加修改環(huán)境變量putenv

    string is test2. The test_env string is (null)7)代碼解析前后兩次通過getenv()獲取環(huán)境變量不一致的原因,在于使用putenv()添加環(huán)境
    發(fā)表于 03-26 09:22

    飛凌嵌入式ElfBoard-環(huán)境變量之獲取環(huán)境變量

    在shell命令行中可以通過多種方式查看環(huán)境變量;shell本身就是一個(gè)進(jìn)程,子進(jìn)程會繼承父進(jìn)程的環(huán)境變量副本,可以直接通過env命令查看當(dāng)前shell進(jìn)程的所有環(huán)境變量;如果想查看特
    發(fā)表于 03-13 08:50

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

    在瑞芯微(RK平臺的嵌入式開發(fā)中,U-Boot作為核心的啟動(dòng)加載程序,負(fù)責(zé)完成鏡像解析、校驗(yàn)、加載等關(guān)鍵流程。而image.c正是U-Boot
    的頭像 發(fā)表于 02-24 16:46 ?1810次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b> image.c:<b class='flag-5'>RK</b><b class='flag-5'>平臺</b>鏡像處理核心邏輯

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

    在嵌入式開發(fā)領(lǐng)域,瑞芯微RK3588憑借超強(qiáng)的算力、豐富的接口和廣泛的場景適配性,成為高端邊緣計(jì)算、消費(fèi)電子項(xiàng)目的熱門選擇。而U-Boot作為嵌入式系統(tǒng)的“第一道門”,負(fù)責(zé)硬件初始化、引導(dǎo)內(nèi)核啟動(dòng),其板級適配代碼直接決定了芯片硬件能力的落地。
    的頭像 發(fā)表于 02-24 15:24 ?978次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>RK</b>3588 <b class='flag-5'>U-Boot</b>板級文件:evb_<b class='flag-5'>rk</b>3588.c核心邏輯拆解

    U-Boot SPL核心文件spl.c深度解析:從啟動(dòng)流程到調(diào)試優(yōu)化

    解析 U-Boot 中 spl.c 文件的功能與作用,探討其在系統(tǒng)調(diào)試和優(yōu)化中的價(jià)值,并通過流程圖和腦圖幫助開發(fā)者快速掌握核心要點(diǎn)。
    的頭像 發(fā)表于 02-05 14:08 ?457次閱讀
    <b class='flag-5'>U-Boot</b> SPL核心文件spl.c<b class='flag-5'>深度</b><b class='flag-5'>解析</b>:從啟動(dòng)流程到調(diào)試優(yōu)化

    深入解析U-Boot命令處理核心文件:功能、調(diào)試與開發(fā)價(jià)值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為主流的引導(dǎo)加載程序,其命令處理、交互邏輯和自動(dòng)啟動(dòng)流程是核心功能模塊。本文將圍繞command.c、cli.c和autoboot.c三個(gè)關(guān)鍵文件,從核心
    的頭像 發(fā)表于 02-03 15:44 ?998次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b>命令處理核心文件:功能、調(diào)試與開發(fā)價(jià)值

    深入解析U-Boot核心文件board_f.c:知識點(diǎn)、調(diào)試要點(diǎn)與開發(fā)價(jià)值

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

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

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

    RK3588平臺串口配置修改指南:切換至串口8

    在嵌入式開發(fā)中,串口作為基礎(chǔ)調(diào)試接口至關(guān)重要。本文檔針對 RK3588 平臺,詳細(xì)介紹如何將系統(tǒng)默認(rèn)串口修改為串口 8(UART8),包括 U-Boot 階段和內(nèi)核階段的配置調(diào)整。該修
    的頭像 發(fā)表于 02-01 16:37 ?1393次閱讀

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

    的啟動(dòng)代碼,拆解?RK3506?平臺?U-Boot?重定位的實(shí)現(xiàn)邏輯、關(guān)鍵步驟與底層原理。 路徑:u-boot/arch/arm/cpu/armv7/start.S 一、重定位的
    的頭像 發(fā)表于 11-28 07:05 ?997次閱讀
    深入理解?<b class='flag-5'>RK</b>3506 <b class='flag-5'>U-Boot</b>?重定位:從代碼到原理

    WIN10配置Hbird-SDK環(huán)境變量

    按照胡老師的《RISC-V CPU下工程與實(shí)踐》的7.4的151和152頁配置Hbird-SDK的環(huán)境變量,出現(xiàn)了問題。 問題如下: 首先創(chuàng)建setup_config.bat,之后CMD中運(yùn)行
    發(fā)表于 10-27 06:38
    南涧| 新沂市| 安乡县| 博白县| 绥江县| 津市市| 沙洋县| 南平市| 磴口县| 连南| 水富县| 达州市| 沁阳市| 乌拉特后旗| 淮阳县| 高密市| 大化| 信宜市| 乌兰浩特市| 舟曲县| 都昌县| 吉木萨尔县| 常宁市| 临西县| 邓州市| 革吉县| 锦州市| 利川市| 彰化县| 义乌市| 县级市| 建宁县| 攀枝花市| 海伦市| 安化县| 湟中县| 安国市| 江西省| 湖南省| 蓬溪县| 曲水县|