==============================================================
零、在sd card初始化过程中,对于bus主要设置以下东西
1、时钟,输出频率
2、工作电压(注意和信号电压区分开来)
如下范围:
(1)
MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */ bit7
(2)
MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */ bit8
(3)
MMC_VDD_21_22 0x00000200 /* VDD voltage 2.1 ~ 2.2 */ bit9
(4)
MMC_VDD_22_23 0x00000400 /* VDD voltage 2.2 ~ 2.3 */ bit10
(5)
MMC_VDD_23_24 0x00000800 /* VDD voltage 2.3 ~ 2.4 */ bit11
(6)
MMC_VDD_24_25 0x00001000 /* VDD voltage 2.4 ~ 2.5 */ bit12
(7)
MMC_VDD_25_26 0x00002000 /* VDD voltage 2.5 ~ 2.6 */ bit13
(8)
MMC_VDD_26_27 0x00004000 /* VDD voltage 2.6 ~ 2.7 */ bit14
(9)
MMC_VDD_27_28 0x00008000 /* VDD voltage 2.7 ~ 2.8 */ bit15
(10)
MMC_VDD_28_29 0x00010000 /* VDD voltage 2.8 ~ 2.9 */ bit16
(11)
MMC_VDD_29_30 0x00020000 /* VDD voltage 2.9 ~ 3.0 */ bit17
(12)
MMC_VDD_30_31 0x00040000 /* VDD voltage 3.0 ~ 3.1 */ bit18
(13)
MMC_VDD_31_32 0x00080000 /* VDD voltage 3.1 ~ 3.2 */ bit19
(14)
MMC_VDD_32_33 0x00100000 /* VDD voltage 3.2 ~ 3.3 */ bit20
(15)
MMC_VDD_33_34 0x00200000 /* VDD voltage 3.3 ~ 3.4 */ bit21
(16)
MMC_VDD_34_35 0x00400000 /* VDD voltage 3.4 ~ 3.5 */ bit22
(17)
MMC_VDD_35_36 0x00800000 /* VDD voltage 3.5 ~ 3.6 */ bit23
3、信号电压(IO电压)
如下范围:
(1)MMC_SIGNAL_VOLTAGE_330
0
(SD card刚上电的时候使用)
(1)
MMC_SIGNAL_VOLTAGE_180
1
4、总线模式
(1)MMC_BUSMODE_OPENDRAIN——》开漏模式
(2)MMC_BUSMODE_PUSHPULL——》上拉模式
5、总线速度模式
(1)
Default Speed mode(DS)
:
3.3V signaling
, Frequency up to 25 MHz, up to 12.5 MB/sec (SD card刚上电的时候使用)
(2)
High Speed mode(HS)
:
3.3V signaling
, Frequency up to 50 MHz, up to 25 MB/sec
(3)
SDR12: 1.8V signaling
, Frequency up to 25 MHz, up to 12.5MB/sec
(4)
SDR25: 1.8V signaling,
Frequency up to 50 MHz, up to 25MB/sec
(5)
SDR50: 1.8V signaling
, Frequency up to 100 MHz, up to 50MB/sec
(6)
SDR104: 1.8V signaling
, Frequency up to 208 MHz, up to 104MB/sec
(7)
DDR50: 1.8V signaling
, Frequency up to 50 MHz, sampled on both clock edges, up to
50MB/sec
6、总线宽度
(1)
一线,
MMC_BUS_WIDTH_1(SD card刚上电的时候使用)
(2)
四线,
MMC_BUS_WIDTH_4
==============================================================
一、时钟的设置?
时钟是由host输出给card的,因此只需要为host设置时钟即可。
注意:并不是说处于什么总线速度模式下就需要设置什么样的频率,而是只需要比其频率小都是可以的。
例如,总线速度模式DS模式下,其最大频率是25MHz,但是host只要输出不超过这个值的频率都可以被处理,刚上电之后,400KHz的时钟频率就是工作在这种速度模式之下。
1、card支持的最大时钟频率
最大时钟频率取决于总线速度模式,
#define HIGH_SPEED_MAX_DTR 50000000 // HS模式的最大频率是50MHz,3.3V
#define UHS_SDR104_MAX_DTR 208000000 // SDR104模式的最大频率是208MHz,1.8V
#define UHS_SDR50_MAX_DTR 100000000 // SDR50模式的最大频率是100MHz,1.8V
#define UHS_DDR50_MAX_DTR 50000000 // DDR50模式的最大频率是50MHz,1.8V
#define UHS_SDR25_MAX_DTR UHS_DDR50_MAX_DTR // SDR模式的最大频率是50MHz,1.8V
#define UHS_SDR12_MAX_DTR 25000000 // HS模式的最大频率是25MHz,1.8V
DS模式的最大频率是25Mhz,3.3V,但是在代码里面并没有定义出来??
(1)对于uhs来说,会在设置总线速度模式的时候,把最大频率设置到card->sw_caps.uhs_max_dtr中
static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status)
case UHS_SDR104_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR;
case UHS_DDR50_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR;
case UHS_SDR50_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR;
case UHS_SDR25_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR;
case UHS_SDR12_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR;
(2)对于HS模式的card来说,最大频率会设置到card->sw_caps.hs_max_dtr中
card->sw_caps.hs_max_dtr = HIGH_SPEED_MAX_DTR;
(3)对于DS模式的card来说,最大频率会设置到card->csd.max_dtr中,
是从card的CSD寄存器中读取出来的:
对于现在的SD card来说,这个值一般是0x32。也就是2.5*10=25MHz
csd->max_dtr
= tran_exp[e] * tran_mant[m];
2、host支持的最大频率和最小频率的说明
对于sdhci host来说,需要host driver提供struct sdhci_ops中的get_min_clock和get_max_clock方法来获取最大频率和最小频率。
然后设置到mmc_host中去
host->max_clk = host->ops->get_max_clock(host); // 由底层host driver提供
mmc->f_max = host->max_clk;
mmc->f_min = host->ops->get_min_clock(host); // 由底层host driver提供
3、如何设置host的时钟频率
使用mmc_set_clock函数进行设置:
对于UHS-I来说,mmc_sd_init_uhs_card——》sd_set_bus_speed_mode——》mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr);
对于HS或者DS来说,mmc_set_clock(host, mmc_sd_get_ma