[U-Boot] [Question]AT91: MMC read and multiple read failed
Song, Elen
Elen.Song at atmel.com
Mon Jul 11 10:42:39 CEST 2011
Hello Reinhard:
I've tried your patch([PATCH] AT91: enable MMC on at91sam(9260/9g20/0xe)ek) on uboot-atmel branch on at91sam9260.The sdcard is correctly initialized,but when I test "mmc read" command, I found two issues.
1.while run command "mmc read 22000000 0 1" to read the first block,it will cause "gen_atmel_mci: CMDR 00051051 (17) ARGR 00000000 (SR: 0c400025) Data Transfer Failed".
Both read and write will fail.Sd1.0 and 2.0 cards face the same problem.
2.cmd 18(multiple read) failed,that means can not run "mmc read 22000000 0 2".
Do you have faced the same problem?
To issues1: "Data Transfer Failed" is caused by transfer data lost(not read),if MCCK too high the host may not receive the data.so I try to reduce the MCCK frequency,it works.
To issues2: While multiple reading ,it did not set block count . so multiple read failed because it don't know how many blocks to read.I set reg MCI_BLKR BCNT bit.It is add in gen_atmel_mci.c.
static int mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
{
...
cmdr = mci_encode_cmd(cmd, data, &error_flags);
/* Send the command */
+if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK) ||(cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK))
+{
+ writel(data->blocks|mmc->read_bl_len<<16,&mci->blkr);
+}
writel(cmd->cmdarg, &mci->argr);
writel(cmdr, &mci->cmdr);
...
MCI_BLKR should be added in mmc.h:
typedef struct atmel_mci {
/* reg Offset */
u32 cr; /* 0x00 */
u32 mr; /* 0x04 */
u32 dtor; /* 0x08 */
u32 sdcr; /* 0x0c */
u32 argr; /* 0x10 */
u32 cmdr; /* 0x14 */
- u32 _18; /* 0x18 */
+ u32 blkr; /* 0x18 */
...
Do you think it is correct?
In that case,I will deliver a patch.
Best regards
elen.song
More information about the U-Boot
mailing list