(续)linux SD卡初始化—mmc_sd_init_card函数

mmc_sd_init_card剩下的关于UHS-I的分支结构。

uhs-I的初始化流程图如图:

红线标出的部分是已经做了的事,与上一篇那个流程图是一致的,之后就是if分支中做的事。

if分支中的函数mmc_sd_init_uhs_card:

/* * UHS-I specific initialization procedure mmc_sd_init_uhs_card(struct mmc_card *card){int err;u8 *status;;;status = kmalloc((!status) {pr_err(, mmc_hostname(card->host));return -ENOMEM;}((card->host->caps & MMC_CAP_4_BIT_DATA) &&//host是否支持4位数据线宽度(card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) {//卡是否支持4位数据线宽度模式err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); (err)goto out;mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4);//host端的设置. }/** Select the bus speed mode depending on host* and card capability.*/sd_update_bus_speed_mode(card);/*这个函数是找一个card和host都支持的速度,类似上面对数据线宽度的操作,spec上有定义:Bus Speed Mode (using 4 parallel data lines) (1) Default Speed mode: 3.3V signaling, Frequency up to 25 MHz, up to 12.5 MB/sec (2) High Speed mode: 3.3V signaling, Frequency up to 50 MHz, up to 25 MB/sec (3) SDR12: UHS-I 1.8V signaling, Frequency up to 25 MHz, up to 12.5MB/sec (4) SDR25: UHS-I 1.8V signaling, Frequency up to 50 MHz, up to 25MB/sec (5) SDR50: UHS-I 1.8V signaling, Frequency up to 100 MHz, up to 50MB/sec (6) SDR104: UHS-I 1.8V signaling, Frequency up to 208 MHz, up to 104MB/sec (7) DDR50: UHS-I 1.8V signaling, Frequency up to 50 MHz, sampled on both clock edges, up to 50MB/sec 期望找到一个host和card支持的最快的速度.err = sd_select_driver_type(card, status);/*driver strength在spec中没找到详细的说明,spec中流程图里有这个步骤.这个也是3.0才增加的,sd卡这边切换用的是CMD6, driver strength属于CMD6的function group 3*/if (err)goto out;err = sd_set_current_limit(card, status); (err)goto out;err = sd_set_bus_speed_mode(card, status); (err)goto out;(!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) {mmc_host_clk_hold(card->host);err = card->host->ops->execute_tuning(card->host,MMC_SEND_TUNING_BLOCK);mmc_host_clk_release(card->host);}out:kfree(status);return err;},失败是什么?没有什么.只是更走近成功一步,

(续)linux SD卡初始化—mmc_sd_init_card函数

相关文章:

你感兴趣的文章:

标签云: