MMC card with spi-sd-card.c

Gene Smith gds at chartertn.net
Tue Dec 23 08:55:14 UTC 2008


Sebastian Huber wrote, On 12/23/2008 03:15 AM:
> Sebastian Huber wrote:
>> Gene Smith wrote:
>>> I have been trying to use an MMC with the "spi/sd" drivers in RTEMS. I 
>>> worked until it tries to send two commands in a loop waiting for idle 
>>> conditon in an init routine:
>>>
>>> rv = sd_card_send_command( e, SD_CARD_CMD_APP_CMD, 0);
>>> CLEANUP_RVSC( rv, sc, sd_card_driver_init_cleanup, "Send: 
>>> SD_CARD_CMD_APP_CMD");
>>> rv = sd_card_send_command( e, SD_CARD_ACMD_SD_SEND_OP_COND, 0);
>>> CLEANUP_RVSC( rv, sc, sd_card_driver_init_cleanup, "Send: 
>>> SD_CARD_ACMD_SD_SEND_OP_COND");
>> These commands set the SD Card into SPI mode.
> [...]
> 
> Oh, I guess I misunderstood you.  You want to use a MMC in SPI mode? There are
> several ways to switch from MMC mode to SPI mode.  This one worked for all
> cards I worked with.  We may use the alternatives if one approach fails.
> 

Yes, that's what I mean. Several typos in my original message may have 
caused what I was asking to be confusing.

Did your SD code work for you with actual MMCs?

As Bob G. suggested, I am doing the SPI/SD/MMC init calls in Init() for 
now. I don't have a serial port so your SYSLOG_* macros all do printk or 
printf and I need syslog() calls via UDP instead, which I added. For 
some reason, and I am not sure why, when SYSLOG() calls are made in 
spi-sd-card.c I only see the last one actually go out:

SYSLOG( "Max transfer speed [b/s] : %" PRIu32 "\n", transfer_speed);

It goes out on UDP port 514 (standard syslog port). But no others before 
get transmitted on UDP per wShark.

I think it may have something to do with the locks/mutexes/semaphores in 
the libi2c code but not sure. I can do my own SYSLOG() calls in Init() 
after returning from bsp_register_spi() and they work.  Interrupts don't 
seem to be disabled.

OK, just checked. When it calls LIBUNLOCK() in unlock_bus() 
rtems_libi2c_send_stop() in sd_card_stop() right after calling the 
SYSLOG("Max transfer...) the UDP message finally sends. I guess the 
previous SYSLOG messages get overwritten since they never go out, just 
the last one after the unlock.

I suppose these locks prevent the network daemons from running but not 
sure.

Any ideas?

-gene




More information about the users mailing list