raspberry pi mmc issue

Alexander Aring alex.aring at gmail.com
Tue Oct 15 14:31:11 EDT 2013


Hi Sascha,

On Tue, Oct 15, 2013 at 02:23:32PM +0200, Sascha Hauer wrote:
> On Tue, Oct 15, 2013 at 01:51:17PM +0200, Alexander Aring wrote:
> > Hi all,
> > 
> > I using a not mainlined raspberry pi qemu implementation [1] and tried to
> > run barebox on it. All seems to working but if I probe the mmc with
> > mci0.probe=1 qemu will crash on a assert on 4 byte assert [2].
> > 
> > I dig a little bit into the Datasheet of bcm2835 [3] which says:
> > 
> > "Contrary to Arasan™’s documentation the EMMC module registers can only
> > be accessed as 32 bit registers, i.e. the two LSBs of the address are
> > always zero."
> > 
> > Then I dig into the barebox bcm2835_mci implementation and found
> > something [4]. We use there a readb on SDHCI_RESPONSE_0 which is not a
> > 32 bit access. I just commented the if branch and it works.
> > 
> > Maybe this can make some errors on a real raspberry, too.
> > 
> > Maybe somebody knows a little bit more about mci and can help me to find
> > a proper solution? Perhaps just make a 32 bit access and do some bit
> > magic with masks and shifts?
> 
> Here the SD card works (both read and write). I can surely test a patch
> converting this access into a 32bit access.
> 
ok I will send a patch which do:

cmd->response[i] |=
	bcm2835_mci_read(
	host,
	SDHCI_RESPONSE_0 +
	(3 - i) * 4 - 1) & 0xFF;

which works for qemu. My workaround (just comment the i != 3 branch) had
some trouble to read partition table. But with this solution all works fine.

But I wonder myself why this works now. We readed a byte from this postion
but now we read 4 bytes from this position and use the lastest bytes. The
correct way should be to make a 24 shift to right. Something like:

cmd->response[i] |=
	bcm2835_mci_read(
	host,
	SDHCI_RESPONSE_0 +
	(3 - i) * 4 - 1) >> 24;

To make a 32 bit access to byte access..

I don't really understand what the code is doing here right now, need
some more time to dig into this. Maybe the read overlaps more than one
register now which isn't well, too.

Another point is that the for loop (with i != 3) and error handling (every
check on ret != -1) looks a little bit crazy for me. Nevertheless I will send
a patch soon.

> The only thing I realize here is that my 3.6.4 kernel fails to access
> the SD card when barebox has accessed it before:
> 
> [    3.623861] mmc0: SD Status: Invalid Allocation Unit size.
> [    3.635586] mmc0: error -110 whilst initialising SD card
> [    3.724743] mmc0: SD Status: Invalid Allocation Unit size.
> [    3.739073] mmc0: error -110 whilst initialising SD card
> [    3.836341] mmc0: SD Status: Invalid Allocation Unit size.
> [    3.847708] mmc0: error -110 whilst initialising SD card
> [    3.965447] mmc0: read SD Status register (SSR) after 3 attempts
> [    3.971483] mmc0: SD Status: Invalid Allocation Unit size.

Mhh, I think my patch would not fix your problem. I successful access
the sdcard after booting linux, but this was on qemu...

- Alex



More information about the barebox mailing list