Arm mmci host controller驱动分析

1.1 Uboot中SD驱动

1.1.1 DTS

mmc0: mmci@60800000 {
compatible = “arm,pl18x”, “arm,primecell”;
reg = <0x60800000 0x1000>;
interrupt-parent = <&gic>;
interrupts = <GIC_SPI 117 0xf04>;
max-frequency = <48000000>;
//vmmc-supply = <&corstone1000_fixed_3v3>;
clocks = <&smbclk>, <&refclk100mhz>;
clock-names = “smclk”, “apb_pclk”;
};

1.1.2 mmc drvier

drivers/mmc/arm_pl180_mmci.c
U_BOOT_DRIVER(arm_pl180_mmc) = {
.name = “arm_pl180_mmc”,
.id = UCLASS_MMC,
.of_match = arm_pl180_mmc_match,
.ops = &arm_pl180_dm_mmc_ops,
.probe = arm_pl180_mmc_probe,
.of_to_plat = arm_pl180_mmc_of_to_plat,
.bind = arm_pl180_mmc_bind,
.priv_auto = sizeof(struct pl180_mmc_host),
.plat_auto = sizeof(struct arm_pl180_mmc_plat),
};

1.1.3 Mmc命令行

static struct cmd_tbl cmd_mmc[] = {
U_BOOT_CMD_MKENT(info, 1, 0, do_mmcinfo, “”, “”),
U_BOOT_CMD_MKENT(read, 4, 1, do_mmc_read, “”, “”),
U_BOOT_CMD_MKENT(wp, 1, 0, do_mmc_boot_wp, “”, “”),
U_BOOT_CMD_MKENT(rescan, 1, 1, do_mmc_rescan, “”, “”),
U_BOOT_CMD_MKENT(part, 1, 1, do_mmc_part, “”, “”),
U_BOOT_CMD_MKENT(dev, 3, 0, do_mmc_dev, “”, “”),
U_BOOT_CMD_MKENT(list, 1, 1, do_mmc_list, “”, “”),
};

1.1.4 do_mmc_rescan

• 先发送CMD0,进入IDEL状态
• 接着再发 CMD8,检查是否是 SD Version 2
• 接着再发 CMD55+ ACMD41,如果 ACMD41 正常返回了,则被认为是一张SD卡
• 再发送CMD2,读取CID
• 再发送CMD3,设置RCA
• 再发送CMD9,读取CSD
• 再发送 CMD7,选中卡
• 再CMD55/CMD51,获取卡的能力
do_mmc_rescan
-》init_mmc_device(curr_device, true)
-》mmc_getcd(mmc)
-》mmc_init(mmc)
-》mmc_start_init(mmc)
-》mmc_get_op_cond
-》supports_uhs(mmc->cfg->host_caps) //是否支持超高速总线,默认没打开
-》mmc_power_init(mmc) //空函数
-》mmc_power_cycle(mmc)
-》mmc_power_off(mmc)
-》mmc_set_clock(mmc, 0, MMC_CLK_DISABLE) //设置为0,关闭时钟
-》mmc_set_ios(mmc)
-》host_set_ios
-》mmc_host_power_cycle(mmc) //空函数
-》mmc_power_on(mmc) //空函数
-》mmc_set_initial_state
-》mmc_set_signal_voltage(mmc, MMC_SIGNAL_VOLTAGE_330) //先尝试3.3V
-》mmc_set_signal_voltage(mmc, MMC_SIGNAL_VOLTAGE_180) //3.3V失败,再尝试1.8V
-》mmc_select_mode(mmc, MMC_LEGACY); //设置为 MMC_LEGACY 模式
-》mmc_set_bus_width(mmc, 1); //设置总线宽度为1
-》mmc->bus_width = width

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值