环境
本文基于U-Boot-2021.10编写
打印环境变量
使用printevn 打印环境变量
# printevn
打印操作由 cmd/nvedit.c—do_env_print()函数完成

do_env_print()会调用同一目录下的env_print()打印环境变量值

设置环境变量
使用setenv 设置环境变量
# setenv [-f] name value
设置操作由 cmd/nvedit.c—do_env_set()函数完成

同样会调用同一目录下的_do_env_set()函数,就不放图了;
保存环境变量
使用setenv 设置环境变量后就可以使用saveenv来保存环境变量
# saveenv
根据存储介质的不同,环境变量被保存在不同的地方,具体操作均由env/ 文件夹中的文件完成
可以使用的存储介质如下

saveenv命令调用env/env.c --env_save()函数

函数内部会去调用注册的save函数,save()由各个存储介质的env操作文件注册,这里以flash为例, 未定义其他存储介质的话,则为nowhere;
先看 spi nor,进入enc/sf.c 最底部可以看到注册的操作函数

环境变量存储在spi flash上的操作则由env_sf_save()函数执行

单截一张图了,具体的操作需要有flash操作知识,感兴趣的可以详细去看;重点关注一下看到的几个可配置值;
CONFIG_ENV_SECT_SIZE //SECT即为sector 扇区大小
/***************************************
sector size即为flash最小操作块大小,可以使用CONFIG_ENV_SECT_SIZE 手动定义
也可以使用CONFIG_ENV_SECT_SIZE_AUTO此时会使用flash驱动中读取到的最小操作块大小即erase size
****************************************/
CONFIG_ENV_SIZE //环境变量存储空间大小
CONFIG_ENV_OFFSET // offset即为环境变量从flash offset字节开始存储
那么如果使用spi nor flash在在config文件中应配置的宏为
CONFIG_ENV_IS_IN_SPI_FLASH=y
CONFIG_ENV_SIZE=value
CONFIG_ENV_SECT_SIZE=value or CONFIG_ENV_SECT_SIZE_AUTO=y
CONFIG_ENV_OFFSET=value
再来看nand,由于nand 需要考虑坏块的存在,如果offset所在地址为坏块,需要跳过该块存储,所以要给定一个范围用于跳坏块的操作,这个空间范围可以是CONFIG_ENV_SIZE的n倍,需额外配置的宏CONFIG_ENV_RANGE,
CONFIG_ENV_IS_IN_NAND=Y
CONFIG_ENV_RANGE = CONFIG_ENV_SIZE * N
注意: 上述nand指raw nand,也就是并行口的nand flash,并非spi nand,当前版本环境变量的存储不支持spi nand,需要自己适配,适配起来也很简单。
本文介绍U-Boot-2021.10版本中环境变量的管理方式,包括打印、设置及保存环境变量的方法。重点讲解了不同存储介质如SPI Flash和NAND Flash上环境变量的具体存储过程。

被折叠的 条评论
为什么被折叠?



