mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-16 09:48:16 +00:00
54925327fa
Now, CONFIG_GENERIC_MMC seems equivalent to CONFIG_MMC. Let's create an entry for "config GENERIC_MMC" with "default MMC", then convert all macro defines in headers to Kconfig. Almost all of the defines will go away. I see only two exceptions: configs/blanche_defconfig configs/sandbox_noblk_defconfig They define CONFIG_GENERIC_MMC, but not CONFIG_MMC. Something might be wrong with these two boards, so should be checked later. Anyway, this is the output of the moveconfig tool. This commit was created as follows: [1] create a config entry in drivers/mmc/Kconfig [2] tools/moveconfig.py -r HEAD GENERIC_MMC [3] manual clean-up of garbage comments in doc/README.* and include/configs/*.h Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Tom Rini <trini@konsulko.com>
75 lines
2.3 KiB
Text
75 lines
2.3 KiB
Text
How to use SD/MMC cards with Atmel SoCs having MCI hardware
|
|
-----------------------------------------------------------
|
|
2010-08-16 Reinhard Meyer <reinhard.meyer@emk-elektronik.de>
|
|
|
|
This is a new approach to use Atmel MCI hardware with the
|
|
general MMC framework. Therefore it benefits from that
|
|
framework's abilities to handle SDHC Cards and the ability
|
|
to write blocks.
|
|
|
|
- AT91SAM9XE512 (tested, will definitely work with XE128 and XE256)
|
|
- AT91SAM9260 (not tested, but MCI is to AT91SAM9XE)
|
|
- AT91SAM9G20 (not tested, should work)
|
|
|
|
It should work with all other ATMEL devices that have MCI,
|
|
including AVR32.
|
|
|
|
The generic driver does NOT assign port pins to the MCI block
|
|
nor does it start the MCI clock. This has to be handled in a
|
|
board/SoC specific manner before the driver is initialized:
|
|
|
|
example: this is added to at91sam9260_devices.c:
|
|
|
|
#if defined(CONFIG_GENERIC_ATMEL_MCI)
|
|
void at91_mci_hw_init(void)
|
|
{
|
|
at91_set_a_periph(AT91_PIO_PORTA, 8, PUP); /* MCCK */
|
|
#if defined(CONFIG_ATMEL_MCI_PORTB)
|
|
at91_set_b_periph(AT91_PIO_PORTA, 1, PUP); /* MCCDB */
|
|
at91_set_b_periph(AT91_PIO_PORTA, 0, PUP); /* MCDB0 */
|
|
at91_set_b_periph(AT91_PIO_PORTA, 5, PUP); /* MCDB1 */
|
|
at91_set_b_periph(AT91_PIO_PORTA, 4, PUP); /* MCDB2 */
|
|
at91_set_b_periph(AT91_PIO_PORTA, 3, PUP); /* MCDB3 */
|
|
#else
|
|
at91_set_a_periph(AT91_PIO_PORTA, 7, PUP); /* MCCDA */
|
|
at91_set_a_periph(AT91_PIO_PORTA, 6, PUP); /* MCDA0 */
|
|
at91_set_a_periph(AT91_PIO_PORTA, 9, PUP); /* MCDA1 */
|
|
at91_set_a_periph(AT91_PIO_PORTA, 10, PUP); /* MCDA2 */
|
|
at91_set_a_periph(AT91_PIO_PORTA, 11, PUP); /* MCDA3 */
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
the board specific file need added:
|
|
...
|
|
#ifdef CONFIG_GENERIC_ATMEL_MCI
|
|
# include <mmc.h>
|
|
#endif
|
|
...
|
|
#ifdef CONFIG_GENERIC_ATMEL_MCI
|
|
/* this is a weak define that we are overriding */
|
|
int board_mmc_init(bd_t *bd)
|
|
{
|
|
/* Enable clock */
|
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_MCI);
|
|
at91_mci_hw_init();
|
|
|
|
/* This calls the atmel_mci_init in gen_atmel_mci.c */
|
|
return atmel_mci_init((void *)AT91_BASE_MCI);
|
|
}
|
|
|
|
/* this is a weak define that we are overriding */
|
|
int board_mmc_getcd(struct mmc *mmc)
|
|
{
|
|
return !at91_get_gpio_value(CONFIG_SYS_MMC_CD_PIN);
|
|
}
|
|
|
|
#endif
|
|
|
|
and the board definition files needs:
|
|
|
|
/* SD/MMC card */
|
|
#define CONFIG_GENERIC_ATMEL_MCI 1
|
|
#define CONFIG_ATMEL_MCI_PORTB 1 /* Atmel XE-EK uses port B */
|
|
#define CONFIG_SYS_MMC_CD_PIN AT91_PIN_PC9
|
|
#define CONFIG_CMD_MMC 1
|