![](https://csdnimg.cn/release/download_crawler_static/86272334/bg4.jpg)
starfive_jh_dwmmc_bind 函数中会进一步创建并绑定 mmc 卡的块设备驱动,作为字符设备的子设备。 函数如下;
U_BOOT_DRIVER(starfive_jh_dwmmc_drv) = {
.name = "JH DWMMC0",
.id = UCLASS_MMC,
.bind = starfive_jh_dwmmc_bind,
};
static int starfive_jh_dwmmc_bind(struct udevice *dev)
{
#ifdef CONFIG_BLK //若系统定义了块功能,则 把 mmc 作为块设备处理。
struct starfive_jh_dwmci_plat *plat = dev_get_plat(dev); //定义一个执行 mmc 设备的平台数据存储区的指
针。
int ret;
ret = dwmci_bind(dev, &plat->mmc, &plat->cfg); //绑定 mmc 块设备。
if (ret)
return ret;
#endif
return 0;
}
//在“D:\workspace\visionsife\u-boot-simple\drivers\mmc\dw_mmc.c“文件中,有:
#ifdef CONFIG_BLK //若系统定义了块功能,则 把 mmc 作为块设备处理
int dwmci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg)
{
return mmc_bind(dev, mmc, cfg);
}
#endif
功能: 设置一个新的 MMC 设备准备探测
子块设备绑定 IF_TYPE_MMC 接口类型。这允许设备与 CONFIG_BLK 一起使用。
@dev: 要设备的 MMC 设备
@mmc: MMC 结构体
@cfg: MMC 的配置信息,这些配置信息来自 mmc 设备的平台数据存储区域,由 mmc 设备的. .of_to_plat =
starfive_jh_dwmmc_of_to_plat 函数,在创建设备模型时从设备树的资源配置中获取并存到 mmc 设备_plat 位置的。
返回值: 若 OK 则返回 0, 错误返回-ve.
int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
{
struct blk_desc *bdesc; //定义指向块描述符的结构体指针*bdesc
struct udevice *bdev; //定义指向新创建设备的设备指针*bdev。
int ret;
if (!mmc_get_ops(dev)) //若创建的 mmc 字符型设备驱动中没有定义操作方法 ops,则返回-ENOSYS
return -ENOSYS;
/* Use the fixed index with aliases node's index 使用带有别名节点索引的固定索引*/
debug("%s: alias devnum=%d\n", __func__, dev_seq(dev));
//根据 mmc 字符设备名来创建名叫 mmc 字符设备名.blk 的块设备,并把新创建的块设备作为子设备挂接在 mmc
//字符型设备上,这个块设备的驱动名叫“mmc_blk”, 设备名叫 mmc@10000000.blk,创建的块设备放在&bdev 中。
并 指 定 这 个 新 创 建 的 块 设 备 的 类 型 为 IF_TYPE_MMC 类 型 , 块 大 小 为 512 字 节 , lba=0. 同 时 给 它 绑 定 名 叫