[U-Boot] [RFC 2/3][v2] mmc: SEND_OP_COND considers card capabilities (voltage)

Raffaele Recalcati lamiaposta71 at gmail.com
Fri Mar 11 07:30:28 CET 2011


On Fri, Mar 11, 2011 at 4:14 AM, Lei Wen <adrian.wenl at gmail.com> wrote:
> On Fri, Mar 11, 2011 at 12:59 AM, Raffaele Recalcati
> <lamiaposta71 at gmail.com> wrote:
>> On Thu, Mar 10, 2011 at 5:29 PM, Lei Wen <adrian.wenl at gmail.com> wrote:
>>> Hi Raffaele,
>>>
>>> On Thu, Mar 10, 2011 at 11:43 PM, Raffaele Recalcati
>>> <lamiaposta71 at gmail.com> wrote:
>>>> From: Raffaele Recalcati <raffaele.recalcati at bticino.it>
>>>>
>>>> The first SEND_OP_COND (CMD1) is used only to ask card capabilities, waiting
>>>> that the card is not busy.
>>>> After it, an AND operation is done between card capabilities and host
>>>> capabilities, (at the moment only for the voltage field).
>>>> Finally the correct value is sent to the MMC.
>>>>
>>>> Signed-off-by: Raffaele Recalcati <raffaele.recalcati at bticino.it>
>>>> ---
>>>>  drivers/mmc/mmc.c |   21 +++++++++++++++++++--
>>>>  include/mmc.h     |    2 ++
>>>>  2 files changed, 21 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>>>> index 042653f..ded630b 100644
>>>> --- a/drivers/mmc/mmc.c
>>>> +++ b/drivers/mmc/mmc.c
>>>> @@ -347,17 +347,34 @@ sd_send_op_cond(struct mmc *mmc)
>>>>
>>>>  int mmc_send_op_cond(struct mmc *mmc)
>>>>  {
>>>> -       int timeout = 1000;
>>>> +       int timeout = 10000;
>>>>        struct mmc_cmd cmd;
>>>>        int err;
>>>>
>>>>        /* Some cards seem to need this */
>>>>        mmc_go_idle(mmc);
>>>>
>>>> +       /* Asking to the card its capabilities */
>>>> +       do {
>>>> +               cmd.cmdidx = MMC_CMD_SEND_OP_COND;
>>>> +               cmd.resp_type = MMC_RSP_R3;
>>>> +               cmd.cmdarg = 0;
>>>> +               cmd.flags = 0;
>>>> +
>>>> +               err = mmc_send_cmd(mmc, &cmd, NULL);
>>>> +
>>>> +               if (err)
>>>> +                       return err;
>>>> +
>>>> +               udelay(1000);
>>>> +       } while (!(cmd.response[0] & OCR_BUSY) && timeout--);
>>>
>>> I think you should not put the first probe a multi-time. In linux framework,
>>> it would skip the first probing.
>>>
>>> I test with this patch and fail to detect my emmc card...
>>> While just let the first probe once, it works fine.
>>>
>>> Best regards,
>>> Lei
>>>
>>
>> Look at JEDEC Standard No. 84-A441 document at page 190.
>> It is normal to ask the card capabilities before setting.
>> But I understand also that in your case there is some issue.
>> I'm sorry, what does "multi-time" mean?
>>
>
> I mean on my board I cannot get (!(cmd.response[0] & OCR_BUSY) to be
> true for the first
> MMC_CMD_SEND_OP_COND until its timeout, which lead to card init fail.
>
> Best regards,
> Lei
>

This means 10msec are not enough.
Even if a board dependent value should be better, can you find please
the minimum value that it nice for your board?
With this value I'll resend the updated patch.
Can you also please test the trace patch (the third one), I think it
is quite useful to discover hw related problems.
Sorry for having sent a not nice patchset (two PATCH and one RFC).


Regards,
Raffaele


More information about the U-Boot mailing list