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

Song, Elen Elen.Song at atmel.com
Tue Jul 12 04:52:29 CEST 2011



-----Original Message-----
From: Reinhard Meyer [mailto:u-boot at emk-elektronik.de] 
Sent: 2011年7月11日 18:27
To: Song, Elen
Cc: u-boot at 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


More information about the U-Boot mailing list