你了解Embeded linux中的Uboot参数与内核?

一、uboot存储方式:
uboot源码:二进制的uboot程序
0xffffffff:uboot分区没有用的空闲空间
uboot环境变量:bootdelay、bootcmd、bootargs等参数,键与值用0x3d,即“=”隔开,两参数之间用0x00,即\0隔开
0x00000000:uboot参数分区没有用的空闲空间
二、uboot参数操作:
2.1 参数:
include/configs/xxx.h//xxx为芯片名称
中定义了一些环境变量默认值的宏定义
common/env_embedded.c
中定义了环境变量键值对字符串结构体
2.2 功能函数:
common/env_common.c
初始化如下结构:
#ifdef config_env_is_in_nand
extern int nand_env_init(void);
extern unsigned char nand_env_get_char_spec(int);
extern int nand_saveenv(void);
extern void nand_env_relocate_spec(void);
static struct env_common_func_t nand_env_cmn_func = {
.env_init = nand_env_init,
.env_get_char_spec = nand_env_get_char_spec,
.saveenv = nand_saveenv,
.env_relocate_spec = nand_env_relocate_spec,
.env_name_spec = nand,
};
#else
static struct env_common_func_t nand_env_cmn_func = {0};
#endif
#ifdef config_env_is_in_spi_flash
extern int sf_env_init(void);
extern unsigned char sf_env_get_char_spec(int);
extern int sf_saveenv(void);
extern void sf_env_relocate_spec(void);
static struct env_common_func_t nand_env_cmn_func = {
.env_init = sf_env_init,
.env_get_char_spec = sf_env_get_char_spec,
.saveenv = sf_saveenv,
.env_relocate_spec = sf_env_relocate_spec,
.env_name_spec = spi flash,
};
#else
static struct env_common_func_t sf_env_cmn_func = {0};
#endif
#ifdef config_env_is_in_emmc
extern int emmc_env_init(void);
extern unsigned char emmc_env_get_char_spec(int);
extern int emmc_saveenv(void);
extern void emmc_env_relocate_spec(void);
static struct env_common_func_t emmc_env_cmn_func = {
.env_init = emmc_env_init,
.env_get_char_spec = emmc_env_get_char_spec,
.saveenv = emmc_saveenv,
.env_relocate_spec = emmc_env_relocate_spec,
.env_name_spec = nand,
};
#else
static struct env_common_func_t emmc_env_cmn_func = {0};
#endif
int env_init(void)
{
switch (get_boot_media())
{
default:
env_cmn_func = null;
break;
case boot_media_nand:
env_cmn_func = &nand_env_cmn_func;
break;
case boot_media_spiflash:
env_cmn_func = &sf_env_cmn_func;
break;
case boot_media_emmc:
env_cmn_func = &emmc_env_cmn_func;
break;
case boot_media_ddr:
env_cmn_func = &sf_env_cmn_func;
break;
}
if (env_cmn_func && !env_cmn_func->env_name_spec)
env_cmn_func = null;
if (!env_cmn_func)
return -1;
env_cmn_func->env_init();
env_name_spec = env_cmn_func->env_name_spec;
return 0;
}
2.3 功能函数调用
common/cmd_nvedit.c
u_boot_cmd(
saveenv, 1, 0, do_saveenv,
save environment variables to persistent storage,
);
int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
extern char * env_name_spec;
env_crc_update ();
return (saveenv()? 1 : 0);
}
三、内核查参方式:
3.1 mtd方式
文件形式,待补
3.2 ioremap
驱动+应用,待补
3.3 mtd_debug
软件移植,待补
3.4 fw_printenv
3.4.1 工具生成方法:
uboot_source_tree # make arch=arm cross_compile=arm-linux-gcc env
uboot_source_tree/tools/env下得到fw_printenv与fw_env.config
3.4.2 将工具与配置文件放到板子文件系统上
3.4.3 修改fw_env.config
device offset 对应于uboot源码目录中include/configs/board_name.h的config_env_offset
env size 对应于uboot源码目录中include/configs/board_name.h的config_env_size
flash sector size 对应于uboot源码目录中include/configs/board_name.h的config_env_sect_size
number of sectors对应于多少块 这里用的是nand flash,如果用nor就不用写这个了
3.4.4 使用方法:
ln -s fw_printenv fw_setenv
读:
fw_printenv 读全参
fw_printenv -n param_name 读指定参
写:
fw_setenvparam_name param_value 写指定参
3.4.5 错误解决办法:
错误a:/include/linux/types.h:154:36: error: conflicting types for ‘uintmax_t’typedef u_int32_t uintmax_t;
arm-linux/target/usr/include/stdint.h:140:32: note: previous declaration of ‘uintmax_t’ was here
typedef unsigned long long int uintmax_t;
解决a:两个文件的uintmax_t类型冲突了,将uboot中的类型按照编译器文件中的类型改过来
错误b:include/linux/types.h:155:36: error: conflicting types for ‘intmax_t’typedef int32_t intmax_t;
arm-linux/target/usr/include/stdint.h:138:24: note: previous declaration of ‘intmax_t’ was here
typedef long long int intmax_t;
解决b:方法同上
错误c:warning: bad crc, using default environment
解决c:方案一、环境变量没save,uboot的环境变量分散于代码中,只有save才会存储与env地址中,如果不存到env地址中,fw_printenv是找不到的
方案二、fw_env.config没设置参数,参数设置方法见3.4.3
四、uboot增加环境变量
4.1 方法一、uboot命令行手动set param_name param_value
4.2 方法二、uboot代码中添加:
1)uboot源码目录中include/configs/board_name.h添加变量宏定义
2)uboot源码目录中common/env_common.c添加

被带宽限制的AI性能,怎么样才能让人工智能提供更好的性能?
人工智能能让我们长生不老吗?
配电箱使用规范要求和维护保养规程
PCB设计的光绘流程解析
2020年印度智能手机总出口额将创历史新高,三星以1160万部遥遥领先
你了解Embeded linux中的Uboot参数与内核?
数之能数据采集平台助力水利物联网在线监测,超限自动报警
NVIDIA助力新兴电动车企业进入市场
毫米波雷达「四场景」|美的&英飞凌,如是说
浅谈FPC板和PCB板的发展
OLED屏不辣眼! OPPO Reno DC调光来了
拓展FPGA市场 机遇与挑战并存
【WWDC2018】:苹果ARkit与安卓ARcore的终极较量
RIGOL发明专利荣获苏州市“优秀专利奖一等奖”
ST发布非接触式支付和数据交换三款新一代NFC芯片
无需散热的3A dc-dc变换器
usb连接器是什么 usb连接器怎么用
苹果13新品发布会
极致奢华!7款土豪专用机型,让你大饱眼福!
多模式多用户交通分配模型的详细功能