在移植uboot到全志H3时,出现了错误:
Saving Environment to FAT… Card did not respond to voltage select!
判定与MMC有关。
同时还有报错:
Error: ethernet@1c30000 address not set.
No ethernet found.
查看源码发现这与环境变量有关(读不到MAC地址),进一步坐实了MMC的问题。
因为板子是自己设计的,只留了SD卡,没有EMMC,所以刚开始以为是虚焊等硬件问题,但进一步分析,既然都到这一步了,SD卡肯定是能正常使用的。
为了找到原因,这里使用orangepi pc plus(带EMMC)验证:
网口依然无法使用,并且出现错误:
Loading Environment from FAT… Unable to use mmc 1:1…
查看mmc:
mmc 1:1说明使用的是EMMC的第1分区,也就是说我想使用SD卡,但在后续板级初始化时,系统会更改MMC,而默认使用的是EMMC,所以需要将其更改SD卡。
找到出现错误的代码:
static int env_fat_load(void)
{
ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
struct blk_desc *dev_desc = NULL;
disk_partition_t info;
int dev, part;
int err;
#ifdef CONFIG_MMC
if (!strcmp(CONFIG_ENV_FAT_INTERFACE, "mmc"))
mmc_initialize(NULL);
#endif
part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE,
CONFIG_ENV_FAT_DEVICE_AND_PART,
&dev_desc, &info, 1); // 识别设备与分区
if (part < 0)
goto err_env_relocate;
dev = dev_desc->devnum;
if (fat_set_blk_dev(dev_desc, &info) != 0) {
/*
* This printf is embedded in the messages from env_save that
* will calling it. The missing \n is intentional.
*/
printf("Unable to use %s %d:%d... ", // 打印错误
CONFIG_ENV_FAT_INTERFACE, dev, part);
goto err_env_relocate;
}
err = file_fat_read(CONFIG_ENV_FAT_FILE, buf, CONFIG_ENV_SIZE);
if (err == -1) {
/*
* This printf is embedded in the messages from env_save that
* will calling it. The missing \n is intentional.
*/
printf("Unable to read \"%s\" from %s%d:%d... ",
CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part);
goto err_env_relocate;
}
return env_import(buf, 1);
err_env_relocate:
env_set_default(NULL, 0);
return -EIO;
}
在出现错误之前,uboot会识别设备与其分区,通过宏“CONFIG_ENV_FAT_DEVICE_AND_PART”来定义,查看配置文件:
#define CONFIG_ENV_FAT_DEVICE_AND_PART “1:auto”
发现它确实被默认配置为EMMC启动,所以这里将1改为0,重新编译,orangepi和自己设计的板子均正常运行。