OK6410A 开发板 (三) 18 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 env

发布者:温暖心情最新更新时间:2022-09-21 来源: csdn关键字:OK6410A  开发板  u-boot  镜像 手机看文章 扫描二维码
随时随地手机看文章

在 u-boot 中, env 有两套机制

在 board_init_f  中有一套

在 board_init_r  中有一套

u-boot 进入 cmdline 或者 bootcmd 时 采用 board_init_r  的那一套


u-boot 运行过程中

board_init_f 

// board_init_f 之前就已经初始化好了 gd->env_buf

// 初始化 gd 结构体变量 地址的时候 初始化的 gd->env_buf

// 因为 gd_t 结构体 如此声明env_buf :  char env_buf[32];

// gd->env_buf 用来装 env_get_ulong->env_get 时,获取的字符串

env_init

env_driver_lookup

env_get_location

return env_locations[prio] ; // ENVL_MMC

_env_driver_lookup

n_ents = xxx

in section .u_boot_list_2_env_driver ,根据 ENVL_MMC 找到对应的 驱动对应的结构体 struct env_driver

drv->init // drv 为找到的结构体 struct env_driver _u_boot_list_2_env_driver_2_mmc 中没有 init 成员

env_set_inited(drv->location)

gd->env_has_init |= (1UL << ENVL_MMC);

// 环境变量的地址

gd->env_addr = (ulong)&default_environment[0];

gd->env_valid = ENV_VALID;

消费者

init_baud_rate

gd->baudrate = env_get_ulong("baudrate", 10, CONFIG_BAUDRATE);

// 找到的是 include/env_default.h L23 中 const uchar default_environment[] 的 "baudrate=" __stringify(CONFIG_BAUDRATE)    ""

env_get

env_get_f

env_get_char

env_get_char_spec

*(uchar *)(gd->env_addr + index)

board_init_r

initr_env

env_relocate();

env_load

drv = env_driver_lookup(ENVOP_LOAD, prio));

printf("Loading Environment from %s... ", drv->name);

drv->load();/env_mmc_load// 将 mmc 中的变量加载到内存中

// env_mmc_load 在 env/mmc.c

// ENV_IS_IN_MMC 决定了 env/mmc.c 编入u-boot

// ENV_IS_IN_MMC 依赖 MMC(mmc的驱动)


struct mmc *mmc = find_mmc_device(dev);

init_mmc_for_env(mmc);

mmc_get_env_addr(mmc, 0, &offset) // offset的单位是字节

// 1. 设备树中分析dt_prop.partition,如果不行再分析下一个

// 2. 设备树中分析dt_prop.offset,如果不行再分析下一个

// 3. CONFIG_ENV_OFFSET

// 该值应该是一个 u64,因为u32最多支持4G

// 但是u-boot在这一个变量的定义处有bug(有的是s64,有的是s32)

// 这个offset的值和u-boot移植人员相关,u-boot移植人员想让其指向什么位置就让其指向什么位置

// 但是要注意mmc的布局

// 我现在用的是一张32G的microsd卡,62410752个sector

// 按照 之前ENV的布局,其实sector是 62409678, 起始字节是 62409678*512 = 0x770979c00

// 单位 : sector

// | 32 | 16 | 1   |1025    |

// |ENV | BL1|SIGN |RESERVED|

read_env(mmc, CONFIG_ENV_SIZE, offset, buf)

env_import(buf, 1, H_EXTERNAL) // 导入到 env_htab 中

// mmc 的env 地址处是空的

if (crc32(0, ep->data, ENV_SIZE) != crc) 

env_set_default("bad CRC", 0); 

printf("*** Warning - %s, " "using default environmentnn", s);

// 做一次转换

himport_r(&env_htab, (char *)default_environment, sizeof(default_environment), '', flags, 0, 0, NULL)

return -ENOMSG;

else if(不空且正常)

// 做一次转换

himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '', flags, 0, 0, NULL)

else // 不空且不正常

env_set_default("import failed", 0);

if(import没问题){

ep = (env_t *)buf;

gd->env_addr = (ulong)&ep->data;

}else // import 有问题

env_set_default(errmsg, 0);

fini_mmc_for_env(mmc);

printf("OKn");

// 打印 为 Loading Environment from MMC... OK

gd->env_load_prio = prio;

env_set_hex("fdtcontroladdr",(unsigned long)map_to_sysmem(gd->fdt_blob));

消费者

image_load_addr = env_get_ulong("loadaddr", 16, image_load_addr);

env_get

hsearch_r(e, ENV_FIND, &ep, &env_htab, 0);

// 在内存中的数据结构 env_htab 中寻值


两套env的不同点

1. 初始化

A. env_init

B. initr_env

2. 初始化中环境变量地址的转移过程

A. default_environment(include/env_default.h L23) -> gd->env_addr

B. mmc(env_mmc_load中的局部变量offset) -> buf(gd->env_addr) -> env_htab

3. env_get_ulong 的路径

A. env_get->env_get_f->env_get_char->env_get_char_spec->*(uchar *)(gd->env_addr + index)

B. env_get->hsearch_r

4. env_get_ulong 中存储得来的字符串的位置

A. 全局变量 gd->env_buf

B. 局部变量 struct env_entry *ep


mmc 中的环境变量

bootargs=root=/dev/mmcblk0p2 rw rootfstype=ext3 init=/linuxrc console=ttySAC0,115200 rootwait

bootcmd=fatload mmc 0:1 0x50008000 uImage;bootm 0x50008000;

关键字:OK6410A  开发板  u-boot  镜像 引用地址:OK6410A 开发板 (三) 18 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 env

上一篇:OK6410A 开发板 (三) 19 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 driver model
下一篇:OK6410A 开发板 (三) 17 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 串口

推荐阅读最新更新时间:2024-11-07 18:07

使用JLink烧写u-boot(基于JZ2440v2的ARM板子)
本文对象:使用笔记本的同志没有JTAG                  需要在Nor-Flash中重新烧写u-boot的                  手中有JLink                  可以使用JLInk烧写u-boot 说明:本文并不对u-boot的制作讲解,只将用J-Link烧写u-boot。 注意:对于JZ2440的板子,JLink只能向Nor-Flash烧写u-boot       1 点击安装jlink驱动,若不熟悉可以全部选择默认安装即可。 2 将Jlink与ARM板子以及电脑连接。   3 板子的启动方式设为Nor启动,再将板子通电。(通电后,JLink上的灯会一直亮着) 4 在“所有程序”
[单片机]
英特尔Edison开发板详细参数猜测
日前,媒体曝光了英特尔Edison开发板的一些参数,我们请先睹为快。 处理器是双核Quark、22nm、400MHz、集成WiFi及蓝牙。 Quark内部集成有一个X86处理器和一个微控制器内核,可编程的微控制器内核,可以帮助系统管理I/O和其他总线功能。X86处理器则负责支持Linux及其他操作系统。 英特尔表示,已经于Autodesk合作,为Edison开发123D的模型库,以便使Edison更好的产品化。 英特尔上一代开发板则是和Arduino兼容的Galileo,处理器是Quark X1000,无法进行视频处理,所以和树莓派、BeagleBone Black相比,稍显逊色。 不过,借由英特尔的收购,Quark可以
[嵌入式]
英特尔Edison<font color='red'>开发板</font>详细参数猜测
u-boot-2009.11移植到mini2440
写下自己移植u-boot-2009 的点点滴滴,希望有助他人。 相关阅读:u-boot-2009.11在mini2440上面的移植 http://www.linuxidc.com/Linux/2011-03/33687.htm 所用环境: u-boot:u-boot-2009.11 Ubuntu:ubuntu9.10 交叉环境:arm-linux-gcc4.3.2 1、下载u-boot-2009.11 U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm。下载其他网站提供的u-boot源码,可以在windows上可以解压,在ubuntu上却解压不了。 2、建立交
[单片机]
u-boot-2011.03在mini2440/micro2440上的移植 支持内核启动
4.1 include/conskfigs/micro2440.h 添加 #define CONFIG_SETUP_MEMORY_TAGS 1 //如果没有定义这个参数,则uboot参数必须加入men=内存大小 #define CONFIG_INITRD_TAG 1 #define CONFIG_CMDLINE_TAG 1 //设置bootargs出入内核必须 #define CONFIG_BOOTARGS noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 【说明】 到此步后,使用bootm后在 Starting kernel ..
[单片机]
瑞萨电子推出基于ARM Cortex-A处理器的mbed微处理器开发板
瑞萨电子推出全球首个支持ARM® Cortex®-A处理器的ARM mbed™开发平台 — 采用了达1000 DMIPS的RZ/A1。 采用RZ/A1系列微处理器的瑞萨电子mbed板 2014年11月11日,日本东京讯—全球领先的半导体解决方案供应商瑞萨电子株式会社(TSE: 6723)将通过最新发布的ARM mbed IoT平台帮助工程师和开发人员简化嵌入式开发工作,助力产品制造和新兴应用开发。瑞萨利用RZ/A1微处理器产品开发出全球首个基于ARM Cortex-A9处理器的mbed微处理器开发板,该产品将方便互联设备设计人员更快地开发出高性能、高功能型嵌入式系统产品。 ARM mbed IoT设备平台提
[单片机]
瑞萨电子推出基于ARM Cortex-A处理器的mbed微处理器<font color='red'>开发板</font>
4412ARM开发板学习笔记(一)
新手在进行开发学习前,建议先看01-迅为电子开发板入门视频。对开发板和开发环境有一定的了解后,不要盲目接线开机。以下是个人的一点经验,和大家分享一下。 补充:这是第一份笔记,主要是提供给刚拿到板子的同学,2、3分钟就可以看完,避免你走歪路。实际上视频上都有,我只是整理了一下。之后我大概不定期会陆续上传一些我的学习笔记分享给大家,希望大家可以给出建议。以后可以的话会整理一下,打包上传,也给后来学习的人一个参考,方便大家共勉。 注:我使用的是4412精英版+7寸屏+SCP封装+2G内存+16G闪存。其他版本可能会有一点点区别,但不影响学习。 一、开机前检查: 电源适配器(5V/2A):插到图上左下角POWER。开发
[单片机]
4412ARM<font color='red'>开发板</font>学习笔记(一)
Altium 发布FPGA 开发板的部署外壳产品
日前,Altium 宣布为其最新 NanoBoard 3000 FPGA 开发板添加即时部署选项。设计人员将无需创建定制的 PCB,便可使 FPGA 设计直接从概念创建过程进入部署实施阶段。 在不到冲泡并品尝一杯咖啡的时间内,使用部署选项便可帮您完成工作,设计人员只需将 NanoBoard 3000 放入 Altium 自主设计的各种新型外壳中即可。 使用它们的模块化结构,设计人员可以使用如下众多方式快速部署放置于 NanoBoard 3000中的基于 FPGA 芯片的设计方案,例如放在桌面上的、挂在墙壁上的、在商业或工业场所应用的、多电路板设计应用的,以及外壳上配有 TFT 显示屏的或者没有配置TFT 显示
[嵌入式]
高速SDRAM存储器接口电路设计(Altera FPGA开发板
高速SDRAM存储器接口电路设计(Altera FPGA开发板)如下图所示:
[模拟电子]
高速SDRAM存储器接口电路设计(Altera FPGA<font color='red'>开发板</font>)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved