
-----Original Message----- From: Reinhard Meyer [mailto:u-boot@emk-elektronik.de] Sent: 2011年7月11日 18:27 To: Song, Elen Cc: u-boot@lists.denx.de Subject: Re: [U-Boot] [Question]AT91: MMC read and multiple read failed
Dear Reinhard,
[snip]
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);
+}
can't we write that register for all commands (remove the if)?
I guess no. Other place ,like "sd_switch" function use it ,but it is not a real read or write.so do not need to set block count.I've tested,the code will stuck.
writel(cmd->cmdarg,&mci->argr); writel(cmdr,&mci->cmdr);
I do not think that the code gets stuck while writing a parameter register with any value, since a command has not been issued to the chip.
It might be that the command gets stuck when an unsuitable value is in one of >the parameter registers.
That itself would require to write another value to BLKR in case of such commands and not let the value be undefined or residual from a previous command.
I think you are right,I printf "data->blocks",that's an unsuitable value. Anyway,I will try to fix it!
[snip]
Another observation: it must be ensured that data->blocks is less than 65536!
Best Regards, Elen.song