MPSoc器件,如果2个SD Controller全部使能了,在同一块硬件同一个软件版本,硬件反复上电重启,uboot或者linux下的mmc index有一定概率会发生变化:大部分情况下emmc是mmc0或者mmcblk0,但是在某次重启有可能emmc 变成了mmc1或者mmcblk1,这种情况会导致Linux寻找内核镜像或者文件系统过程中出现错误,导致启动失败。
我们看下mmc 的index是从哪里获取的:
系统启动过程中会有一个默认打印:
MMC:
mmc@ff160000: 0, mmc@ff170000: 1
我们看这个打印的0和1是从哪里来的:
源码:
从代码里可以看到这个0或者1是从 desc的devnum中来的。
initr_dm --> dm_init_and_scan(false)-->dm_init(CONFIG_IS_ENABLED(OF_LIVE))--> device_bind_by_name(NULL, false, &root_info,&DM_ROOT_NON_CONST)--> device_bind_common -->dev_read_alias_seq(dev, &dev->seq_)-->fdtdec_get_alias_seq
从上面代码也可以看出,index下来源于设备树的mmc开头的aliase。
在device_bind_common函数实现过程中,索引值被直接复制给了(struct udevice *dev)dev->seq。
在mmc_bind过程中,调用了blk_create_device函数:
最终index赋值给了blk_desc的devnum
3.1 mmc driver的注册过程:
sdhci_arasan_probe -->sdhci_pltfm_init-->mmc_alloc_host
可以看到mmc的index也来源于设备树的mmc 的别名。
在 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
中增加:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。