[U-Boot] [PATCH] mmc: modified calculated mmc-capacity & set mmc trans_speed

Jae hoon Chung jh80.chung at gmail.com
Fri May 7 08:45:39 CEST 2010


Dear Andy

Thanks for your comment..
but i have some question...

2010/5/7 Andy Fleming <afleming at gmail.com>:
> On Wed, Apr 7, 2010 at 10:36 PM, Jae hoon Chung <jh80.chung at gmail.com> wrote:
>> The patches do the following
>> 1. If mmc size is more than 2GB , we need to calculated using the
>> extended csd register.
>
> This description is slightly inaccurate.  I have encountered MMC cards
> with 4GB capacity, which are not actually high-capacity cards.  But
> certainly there's a bug in the current code where high-capacity MMC
> cards are not getting proper size calculations.
>

that means 4GB capacity is not high-capacity cards, right?
i understood that higher than 2GB is supported high-capacity..
if i mis-understood, i'll check the spec.

>
>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>> index cf4ea16..c985924 100644
>> --- a/drivers/mmc/mmc.c
>> +++ b/drivers/mmc/mmc.c
>> @@ -410,6 +410,10 @@ int mmc_change_freq(struct mmc *mmc)
>>        if (ext_csd[212] || ext_csd[213] || ext_csd[214] || ext_csd[215])
>>                mmc->high_capacity = 1;
>>
>> +       if (mmc->high_capacity)
>> +               mmc->capacity = ((ext_csd[215] << 24) | (ext_csd[214] << 16) |
>> +                               (ext_csd[213] << 8) | ext_csd[212]);
>> +
>
>
> This is off by a factor of block size.  Capacity is supposed to be the
> size in bytes, and this sets it to the size in blocks, I believe.
>
> Hmm... I don't like that we are now doing the calculation twice for
> high-capacity MMC cards, but I guess that's fine for now, as this only
> affects v4 and higher, and extracting it is a bit more of a pain than
> I originally thought.
>
> On a side note, does this mean you have a high-capacity MMC card?  And
> can you point me to a place to get one?  We've been trying to test MMC
> high-capacity for a while, and have yet to find a real one (we found
> that 4GB one I mentioned, and it does normal byte-addressing).
>

didn't you have high-capacity card?
we tested with 8GB moviNAND card, below is mmc card information using
that code..

Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.3
High Capacity: Yes
Capacity: 7840 MByte
Bus Width: 4-bit

and if card is higher than 2GB, access mode selected sector mode..
why does card do normal byte-addressing?

> So just multiply capacity by block size, and we can apply this.
>
>
>>        cardtype = ext_csd[196] & 0xf;
>>
>>        err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
>> @@ -794,12 +798,11 @@ int mmc_startup(struct mmc *mmc)
>>
>>                if (mmc->card_caps & MMC_MODE_HS) {
>>                        if (mmc->card_caps & MMC_MODE_HS_52MHz)
>> -                               mmc_set_clock(mmc, 52000000);
>> +                               mmc->tran_speed = 52000000;
>>                        else
>> -                               mmc_set_clock(mmc, 26000000);
>> -               } else
>> -                       mmc_set_clock(mmc, 20000000);
>> -       }
>> +                               mmc->tran_speed = 26000000;
>> +               }
>> +               mmc_set_clock(mmc, mmc->tran_speed);
>
> This looks good.
>
>
> Andy
>

Thanks

Jaehoon Chung


More information about the U-Boot mailing list