前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >MPSoc如何固定EMMC的索引(mmc0/mmc1 index)

MPSoc如何固定EMMC的索引(mmc0/mmc1 index)

原创
作者头像
Frank-大龙
修改2024-12-02 15:59:32
修改2024-12-02 15:59:32
1190
举报
文章被收录于专栏:Petalinux

一、需求/问题

MPSoc器件,如果2个SD Controller全部使能了,在同一块硬件同一个软件版本,硬件反复上电重启,uboot或者linux下的mmc index有一定概率会发生变化:大部分情况下emmc是mmc0或者mmcblk0,但是在某次重启有可能emmc 变成了mmc1或者mmcblk1,这种情况会导致Linux寻找内核镜像或者文件系统过程中出现错误,导致启动失败。

二、Uboot下index的来源:

2.1 emmc index使用过程

我们看下mmc 的index是从哪里获取的:

系统启动过程中会有一个默认打印:

MMC:

mmc@ff160000: 0, mmc@ff170000: 1

我们看这个打印的0和1是从哪里来的:

源码:

从代码里可以看到这个0或者1是从 desc的devnum中来的。

2.2 uboot emmc index 赋值过程

2.2.1 代码调用路径

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

2.2.2 fdtdec_get_alias_seq

fdtdec_get_alias_seq实现过程
fdtdec_get_alias_seq实现过程

从上面代码也可以看出,index下来源于设备树的mmc开头的aliase。

2.2.3 index 赋值

在device_bind_common函数实现过程中,索引值被直接复制给了(struct udevice *dev)dev->seq。

在mmc_bind过程中,调用了blk_create_device函数:

最终index赋值给了blk_desc的devnum

三、Linux下mmcblkX的index查找使用过程:

3.1 mmc driver的注册过程:

sdhci_arasan_probe -->sdhci_pltfm_init-->mmc_alloc_host

可以看到mmc的index也来源于设备树的mmc 的别名。

四、修改dts,实现index的固定

在 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

中增加:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、需求/问题
  • 二、Uboot下index的来源:
    • 2.1 emmc index使用过程
    • 2.2 uboot emmc index 赋值过程
      • 2.2.1 代码调用路径
      • 2.2.2 fdtdec_get_alias_seq
      • 2.2.3 index 赋值
  • 三、Linux下mmcblkX的index查找使用过程:
  • 四、修改dts,实现index的固定
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档