[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