[U-Boot] [Question]AT91: MMC read and multiple read failed

Reinhard Meyer u-boot at emk-elektronik.de
Mon Jul 11 12:27:01 CEST 2011


Dear Song, Elen,
> [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.

>>> [snip]

Another observation: it must be ensured that data->blocks is less than 65536!

Best Regards,
Reinhard


More information about the U-Boot mailing list