sd的扇区分布
首先需要了解整个sd开的扇区分布情况,如下图
uboot在sd卡中的位置
在使用sd_fusing烧写uboot是时,使用dd命令将uboot的bl1和bl2分别烧写到了1-16,49-x,其中x取决于uboot的大小,sd卡的扇区大小为512Byte
环境变量在sd卡中的位置
在重定位代码时,uboot从sd卡的MOVI_BL2_PS这个地址开始拷贝出bl2的代码,如下图
MOVI_BL2_PS这个地址的前面的扇区分配如下:
0扇区,大小为(eFUSE_SIZE/MOVI_BLKSIZE):空闲
1-16扇区,大小为MOVI_BL1BLKCNT:存放bl1的代码
17-48扇区,大小为MOVI_ENV_BLKCNT:存放env
所以可以得到uboot希望我们把环境变量发到17-48扇区
在配置头文件中添加环境变量在sd卡中存放的地址
save命令的功能有saveenv函数实现,在saveenv函数通过mmc_get_env_addr()函数得到环境变量存放的首地址,并通过write_env()函数将环境变量保存到sd卡中
而mmc_get_env_addr()函数这个函数时通过CONFIG_ENV_OFFSET这个宏来返回环境变量在sd卡中的首地址的,所以只需要在配置头文件中定义CONFIG_ENV_OFFSET这个宏,并将其设为 17*512 即可(512为sd扇区大小)