[U-Boot] [PATCH 1/7] mmc: support hs400 enhanced strobe mode

Jean-Jacques Hiblot jjhiblot at ti.com
Wed Jul 10 09:01:02 UTC 2019


Hi Peng,

On 10/07/2019 09:51, Peng Fan wrote:
> +#if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
> +#if !CONFIG_IS_ENABLED(DM_MMC)
> +static void mmc_set_enhanced_strobe(struct mmc *mmc)
> +{
> +}
> +#endif
> +static int mmc_select_hs400es(struct mmc *mmc)
> +{
> +	int err;
> +
> +	err = mmc_set_card_speed(mmc, MMC_HS, true);
> +	if (err)
> +		return err;
> +
> +	err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH,
> +			 EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_FLAG |
> +			 EXT_CSD_BUS_WIDTH_STROBE);
> +	if (err) {
> +		printf("switch to bus width for hs400 failed\n");
> +		return err;
> +	}
> +	/* TODO: driver strength */

> +	err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING,
> +			 EXT_CSD_TIMING_HS400 | (0 << EXT_CSD_DRV_STR_SHIFT));

you can use mmc_set_card_speed() for this.


> diff --git a/include/mmc.h b/include/mmc.h
> index 2be3e91fcb..9eb328384e 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -65,6 +65,7 @@
>   #define MMC_MODE_DDR_52MHz	MMC_CAP(MMC_DDR_52)
>   #define MMC_MODE_HS200		MMC_CAP(MMC_HS_200)
>   #define MMC_MODE_HS400		MMC_CAP(MMC_HS_400)
> +#define MMC_MODE_HS400_ES	MMC_CAP(MMC_HS_400_ES)
>   
>   #define MMC_CAP_NONREMOVABLE	BIT(14)
>   #define MMC_CAP_NEEDS_POLL	BIT(15)
> @@ -223,6 +224,7 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
>   #define EXT_CSD_BOOT_BUS_WIDTH		177
>   #define EXT_CSD_PART_CONF		179	/* R/W */
>   #define EXT_CSD_BUS_WIDTH		183	/* R/W */
> +#define EXT_CSD_STROBE_SUPPORT		184	/* R/W */
>   #define EXT_CSD_HS_TIMING		185	/* R/W */
>   #define EXT_CSD_REV			192	/* RO */
>   #define EXT_CSD_CARD_TYPE		196	/* RO */
> @@ -264,11 +266,13 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
>   #define EXT_CSD_DDR_BUS_WIDTH_4	5	/* Card is in 4 bit DDR mode */
>   #define EXT_CSD_DDR_BUS_WIDTH_8	6	/* Card is in 8 bit DDR mode */
>   #define EXT_CSD_DDR_FLAG	BIT(2)	/* Flag for DDR mode */
> +#define EXT_CSD_BUS_WIDTH_STROBE BIT(7)	/* Enhanced strobe mode */
>   
>   #define EXT_CSD_TIMING_LEGACY	0	/* no high speed */
>   #define EXT_CSD_TIMING_HS	1	/* HS */
>   #define EXT_CSD_TIMING_HS200	2	/* HS200 */
>   #define EXT_CSD_TIMING_HS400	3	/* HS400 */
> +#define EXT_CSD_DRV_STR_SHIFT	4	/* Driver Strength shift */
>   
>   #define EXT_CSD_BOOT_ACK_ENABLE			(1 << 6)
>   #define EXT_CSD_BOOT_PARTITION_ENABLE		(1 << 3)
> @@ -465,6 +469,11 @@ struct dm_mmc_ops {
>   	 */
>   	int (*wait_dat0)(struct udevice *dev, int state, int timeout);
>   #endif
> +
> +#if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
> +	/* set_enhanced_strobe() - set HS400 enhanced strobe */
> +	void (*set_enhanced_strobe)(struct udevice *dev);

Can this function somehow fail ? I'd rather have it return a int if so


JJ


> +#endif
>   };
>   
>   #define mmc_get_ops(dev)        ((struct dm_mmc_ops *)(dev)->driver->ops)
> @@ -485,6 +494,7 @@ int mmc_getcd(struct mmc *mmc);
>   int mmc_getwp(struct mmc *mmc);
>   int mmc_execute_tuning(struct mmc *mmc, uint opcode);
>   int mmc_wait_dat0(struct mmc *mmc, int state, int timeout);
> +void mmc_set_enhanced_strobe(struct mmc *mmc);
>   
>   #else
>   struct mmc_ops {
> @@ -530,6 +540,7 @@ enum bus_mode {
>   	UHS_SDR104,
>   	MMC_HS_200,
>   	MMC_HS_400,
> +	MMC_HS_400_ES,
>   	MMC_MODES_END
>   };
>   
> @@ -547,6 +558,10 @@ static inline bool mmc_is_mode_ddr(enum bus_mode mode)
>   #if CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
>   	else if (mode == MMC_HS_400)
>   		return true;
> +#endif
> +#if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
> +	else if (mode == MMC_HS_400_ES)
> +		return true;
>   #endif
>   	else
>   		return false;



More information about the U-Boot mailing list