sd_mmc_spi_mem.c File Reference


Detailed Description

CTRL_ACCESS interface for SD/MMC card.

Author:
Atmel Corporation: http://www.atmel.com
Support and FAQ: http://support.atmel.no/

Definition in file sd_mmc_spi_mem.c.

#include "conf_access.h"
#include "conf_sd_mmc_spi.h"
#include "sd_mmc_spi.h"
#include "sd_mmc_spi_mem.h"
#include "usb_drv.h"
#include "scsi_decoder.h"

Go to the source code of this file.

Defines

#define Sd_mmc_spi_access_signal_off()
#define Sd_mmc_spi_access_signal_on()

Functions

Ctrl_status sd_mmc_spi_mem_2_ram (U32 addr, void *ram)
 This fonction reads 1 sector from SD/MMC to internal ram buffer.
void sd_mmc_spi_mem_init (void)
 This function initializes the hw/sw resources required to drive the SD_MMC_SPI.
Ctrl_status sd_mmc_spi_ram_2_mem (U32 addr, const void *ram)
 This fonction initialises the memory for a write operation from ram buffer to SD/MMC (1 sector).
Ctrl_status sd_mmc_spi_read_capacity (U32 *u32_nb_sector)
 This function gives the address of the last valid sector.
void sd_mmc_spi_read_multiple_sector_callback (const void *psector)
Bool sd_mmc_spi_removal (void)
 This function tells if the memory has been removed or not.
Ctrl_status sd_mmc_spi_test_unit_ready (void)
 This function tests the state of the SD_MMC memory and sends it to the Host.
Ctrl_status sd_mmc_spi_usb_read_10 (U32 addr, U16 nb_sector)
 This function performs a read operation of n sectors from a given address on.
Ctrl_status sd_mmc_spi_usb_write_10 (U32 addr, U16 nb_sector)
 This fonction initialises the SD/MMC memory for a write operation.
Bool sd_mmc_spi_wr_protect (void)
 This function returns the write protected status of the memory.
void sd_mmc_spi_write_multiple_sector_callback (void *psector)

Variables

U32 SD_MMC_SPI_DISK_SIZE
Bool sd_mmc_spi_init_done
volatile U32 sd_mmc_spi_last_address
U8 sd_mmc_spi_presence_status = SD_MMC_INSERTED


Define Documentation

 
#define Sd_mmc_spi_access_signal_off (  ) 

 
#define Sd_mmc_spi_access_signal_on (  ) 


Function Documentation

Ctrl_status sd_mmc_spi_mem_2_ram ( U32  addr,
void *  ram 
)

This fonction reads 1 sector from SD/MMC to internal ram buffer.

DATA FLOW is: SD/MMC => RAM

(sector = 512B)

Parameters:
addr Sector address to read
ram Ram buffer pointer
Returns:
Ctrl_status It is ready -> CTRL_GOOD An error occurs -> CTRL_FAIL

Definition at line 304 of file sd_mmc_spi_mem.c.

References Sd_mmc_spi_access_signal_off, Sd_mmc_spi_access_signal_on, sd_mmc_spi_check_presence(), sd_mmc_spi_init_done, sd_mmc_spi_mem_init(), sd_mmc_spi_read_close(), sd_mmc_spi_read_open(), sd_mmc_spi_read_sector_to_ram(), and sd_mmc_spi_write_close().

00305 {
00306    Sd_mmc_spi_access_signal_on();
00307    sd_mmc_spi_check_presence();
00308 
00309    if (sd_mmc_spi_init_done == FALSE)
00310    {
00311       sd_mmc_spi_mem_init();
00312    }
00313 
00314    if (sd_mmc_spi_init_done == TRUE)
00315    {
00316      sd_mmc_spi_read_open(addr);
00317      if (KO == sd_mmc_spi_read_sector_to_ram(ram))
00318      {
00319        sd_mmc_spi_write_close();
00320        Sd_mmc_spi_access_signal_off();
00321        return CTRL_NO_PRESENT;
00322      }
00323      sd_mmc_spi_read_close();
00324      Sd_mmc_spi_access_signal_off();
00325      return CTRL_GOOD;
00326    }
00327    Sd_mmc_spi_access_signal_off();
00328 
00329    return CTRL_NO_PRESENT;
00330 }

void sd_mmc_spi_mem_init ( void   ) 

This function initializes the hw/sw resources required to drive the SD_MMC_SPI.

/

Definition at line 81 of file sd_mmc_spi_mem.c.

References sd_mmc_spi_internal_init().

Referenced by sd_mmc_spi_mem_2_ram(), sd_mmc_spi_ram_2_mem(), sd_mmc_spi_read_capacity(), sd_mmc_spi_usb_read_10(), and sd_mmc_spi_usb_write_10().

00082 {
00083   sd_mmc_spi_internal_init();        // Restart Init of SD/MMC card after previous first init
00084 }

Ctrl_status sd_mmc_spi_ram_2_mem ( U32  addr,
const void *  ram 
)

This fonction initialises the memory for a write operation from ram buffer to SD/MMC (1 sector).

DATA FLOW is: RAM => SD/MMC

(sector = 512B)

Parameters:
addr Sector address to write
ram Ram buffer pointer
Returns:
Ctrl_status It is ready -> CTRL_GOOD An error occurs -> CTRL_FAIL

Definition at line 346 of file sd_mmc_spi_mem.c.

References Sd_mmc_spi_access_signal_off, Sd_mmc_spi_access_signal_on, sd_mmc_spi_check_presence(), sd_mmc_spi_init_done, sd_mmc_spi_mem_init(), sd_mmc_spi_write_close(), sd_mmc_spi_write_open(), and sd_mmc_spi_write_sector_from_ram().

00347 {
00348    Sd_mmc_spi_access_signal_on();
00349    sd_mmc_spi_check_presence();
00350 
00351    if (sd_mmc_spi_init_done == FALSE)
00352    {
00353       sd_mmc_spi_mem_init();
00354    }
00355 
00356    if (sd_mmc_spi_init_done == TRUE)
00357    {
00358      sd_mmc_spi_write_open(addr);
00359      if (KO == sd_mmc_spi_write_sector_from_ram(ram))
00360      {
00361        sd_mmc_spi_write_close();
00362        Sd_mmc_spi_access_signal_off();
00363        return CTRL_NO_PRESENT;
00364      }
00365      sd_mmc_spi_write_close();
00366      Sd_mmc_spi_access_signal_off();
00367      return CTRL_GOOD;
00368    }
00369    Sd_mmc_spi_access_signal_off();
00370 
00371    return CTRL_NO_PRESENT;
00372 }

Ctrl_status sd_mmc_spi_read_capacity ( U32 *  u32_nb_sector  ) 

This function gives the address of the last valid sector.

Parameters:
*u32_nb_sector number of sector (sector = 512B). OUT
Returns:
Ctrl_status Media ready -> CTRL_GOOD Media not present -> CTRL_NO_PRESENT /

Definition at line 152 of file sd_mmc_spi_mem.c.

References Sd_mmc_spi_access_signal_off, Sd_mmc_spi_access_signal_on, sd_mmc_spi_init_done, sd_mmc_spi_last_block_address, and sd_mmc_spi_mem_init().

00153 {
00154 //   sd_mmc_spi_check_presence();   // ommited because creates interferences with "sd_mmc_spi_test_unit_ready()" function
00155    Sd_mmc_spi_access_signal_on();
00156 
00157    if (sd_mmc_spi_init_done == FALSE)
00158    {
00159       sd_mmc_spi_mem_init();
00160    }
00161 
00162    if (sd_mmc_spi_init_done == TRUE)
00163    {
00164      *u32_nb_sector = sd_mmc_spi_last_block_address+1;
00165      Sd_mmc_spi_access_signal_off();
00166      return CTRL_GOOD;
00167    }
00168    else
00169    {
00170      Sd_mmc_spi_access_signal_off();
00171      return CTRL_NO_PRESENT;
00172    }
00173 }

void sd_mmc_spi_read_multiple_sector_callback ( const void *  psector  ) 

Definition at line 239 of file sd_mmc_spi_mem.c.

References MMC_SECTOR_SIZE.

Referenced by sd_mmc_spi_read_multiple_sector().

00240 {
00241   U16 data_to_transfer = MMC_SECTOR_SIZE;
00242 
00243   while (data_to_transfer)
00244   {
00245     while (!Is_usb_in_ready(g_scsi_ep_ms_in));
00246 
00247     Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in);
00248     data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, psector,
00249                                              data_to_transfer, &psector);
00250     Usb_ack_in_ready_send(g_scsi_ep_ms_in);
00251   }
00252 }

Bool sd_mmc_spi_removal ( void   ) 

This function tells if the memory has been removed or not.

Returns:
FALSE -> The memory isn't removed /

Definition at line 196 of file sd_mmc_spi_mem.c.

00197 {
00198   return FALSE;
00199 //  return ((OK == sd_mmc_spi_check_presence()) ? FALSE : TRUE);
00200 }

Ctrl_status sd_mmc_spi_test_unit_ready ( void   ) 

This function tests the state of the SD_MMC memory and sends it to the Host.

For a PC, this device is seen as a removable media Before indicating any modification of the status of the media (GOOD->NO_PRESENT or vice-versa), the function must return the BUSY data to make the PC accepting the change

Returns:
Ctrl_status Media is ready -> CTRL_GOOD Media not present -> CTRL_NO_PRESENT Media has changed -> CTRL_BUSY /

Definition at line 88 of file sd_mmc_spi_mem.c.

References SD_MMC_INSERTED, SD_MMC_REMOVED, SD_MMC_REMOVING, Sd_mmc_spi_access_signal_off, Sd_mmc_spi_access_signal_on, sd_mmc_spi_init_done, sd_mmc_spi_mem_check(), and sd_mmc_spi_presence_status.

00089 {
00090   Sd_mmc_spi_access_signal_on();
00091   switch (sd_mmc_spi_presence_status)
00092   {
00093     case SD_MMC_REMOVED:
00094       sd_mmc_spi_init_done = FALSE;
00095       if (OK == sd_mmc_spi_mem_check())
00096       {
00097         sd_mmc_spi_presence_status = SD_MMC_INSERTED;
00098         Sd_mmc_spi_access_signal_off();
00099         return CTRL_BUSY;
00100       }
00101       Sd_mmc_spi_access_signal_off();
00102       return CTRL_NO_PRESENT;
00103 
00104     case SD_MMC_INSERTED:
00105       if (OK != sd_mmc_spi_mem_check())
00106       {
00107         sd_mmc_spi_presence_status = SD_MMC_REMOVING;
00108         sd_mmc_spi_init_done = FALSE;
00109         Sd_mmc_spi_access_signal_off();
00110         return CTRL_BUSY;
00111       }
00112       Sd_mmc_spi_access_signal_off();
00113       return CTRL_GOOD;
00114 
00115     case SD_MMC_REMOVING:
00116       sd_mmc_spi_presence_status = SD_MMC_REMOVED;
00117       Sd_mmc_spi_access_signal_off();
00118       return CTRL_NO_PRESENT;
00119 
00120     default:
00121       sd_mmc_spi_presence_status = SD_MMC_REMOVED;
00122       Sd_mmc_spi_access_signal_off();
00123       return CTRL_BUSY;
00124   }
00125 
00126 /*
00127   if (OK==sd_mmc_spi_mem_check())
00128   {
00129     if (sd_mmc_spi_status_changed == FALSE)
00130     {
00131       sd_mmc_spi_status_changed = TRUE;
00132       return CTRL_BUSY;     // BUSY token must be returned to indicate a status change !
00133     }
00134     else
00135       return CTRL_GOOD;     // the 2nd time the host will ask for unit_ready, we can answer GOOD if we have returned BUSY first !
00136   }
00137   else
00138   {
00139     if (sd_mmc_spi_status_changed == TRUE)
00140     {
00141       sd_mmc_spi_status_changed = FALSE;
00142       return CTRL_BUSY;     // BUSY token must be returned to indicate a status change !
00143     }
00144     else
00145       return CTRL_NO_PRESENT;
00146   }
00147 */
00148 }

Ctrl_status sd_mmc_spi_usb_read_10 ( U32  addr,
U16  nb_sector 
)

This function performs a read operation of n sectors from a given address on.

(sector = 512B)

DATA FLOW is: SD_MMC => USB

Parameters:
addr Sector address to start the read from
nb_sector Number of sectors to transfer
Returns:
Ctrl_status It is ready -> CTRL_GOOD A error occur -> CTRL_FAIL

Definition at line 213 of file sd_mmc_spi_mem.c.

References Sd_mmc_spi_access_signal_off, Sd_mmc_spi_access_signal_on, sd_mmc_spi_init_done, sd_mmc_spi_mem_init(), sd_mmc_spi_read_close(), sd_mmc_spi_read_multiple_sector(), and sd_mmc_spi_read_open().

00214 {
00215 Bool status;
00216 
00217    if (sd_mmc_spi_init_done == FALSE)
00218    {
00219       sd_mmc_spi_mem_init();
00220    }
00221 
00222    if (sd_mmc_spi_init_done == TRUE)
00223    {
00224      Sd_mmc_spi_access_signal_on();
00225      sd_mmc_spi_read_open(addr);
00226      status = sd_mmc_spi_read_multiple_sector(nb_sector);
00227      sd_mmc_spi_read_close();
00228      Sd_mmc_spi_access_signal_off();
00229      if (status == OK)
00230         return CTRL_GOOD;
00231      else
00232         return CTRL_NO_PRESENT;
00233    }
00234    else
00235      return CTRL_NO_PRESENT;
00236 }

Ctrl_status sd_mmc_spi_usb_write_10 ( U32  addr,
U16  nb_sector 
)

This fonction initialises the SD/MMC memory for a write operation.

DATA FLOW is: USB => SD_MMC

(sector = 512B)

Parameters:
addr Sector address to start write
nb_sector Number of sectors to transfer
Returns:
Ctrl_status It is ready -> CTRL_GOOD An error occurs -> CTRL_FAIL

Definition at line 256 of file sd_mmc_spi_mem.c.

References Sd_mmc_spi_access_signal_off, Sd_mmc_spi_access_signal_on, sd_mmc_spi_init_done, sd_mmc_spi_mem_init(), sd_mmc_spi_write_close(), sd_mmc_spi_write_multiple_sector(), and sd_mmc_spi_write_open().

00257 {
00258   Bool status;
00259 
00260    if (sd_mmc_spi_init_done == FALSE)
00261    {
00262       sd_mmc_spi_mem_init();
00263    }
00264 
00265    if (sd_mmc_spi_init_done == TRUE)
00266    {
00267      Sd_mmc_spi_access_signal_on();
00268      sd_mmc_spi_write_open(addr);
00269      status = sd_mmc_spi_write_multiple_sector(nb_sector);
00270      sd_mmc_spi_write_close();
00271      Sd_mmc_spi_access_signal_off();
00272      if (status == OK)
00273        return CTRL_GOOD;
00274      else
00275        return CTRL_NO_PRESENT;
00276    }
00277    else
00278      return CTRL_NO_PRESENT;
00279 }

Bool sd_mmc_spi_wr_protect ( void   ) 

This function returns the write protected status of the memory.

Only used by memory removal with a HARDWARE SPECIFIC write protected detection ! The user must unplug the memory to change this write protected status, which cannot be for a SD_MMC.

Returns:
FALSE -> the memory is not write-protected (always) /

Definition at line 185 of file sd_mmc_spi_mem.c.

00186 {
00187    return FALSE;
00188 }

void sd_mmc_spi_write_multiple_sector_callback ( void *  psector  ) 

Definition at line 282 of file sd_mmc_spi_mem.c.

References MMC_SECTOR_SIZE.

Referenced by sd_mmc_spi_write_multiple_sector().

00283 {
00284   U16 data_to_transfer = MMC_SECTOR_SIZE;
00285 
00286   while (data_to_transfer)
00287   {
00288     while (!Is_usb_out_received(g_scsi_ep_ms_out));
00289 
00290     Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out);
00291     data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, psector,
00292                                             data_to_transfer, &psector);
00293     Usb_ack_out_received_free(g_scsi_ep_ms_out);
00294   }
00295 }


Variable Documentation

U8 sd_mmc_spi_presence_status = SD_MMC_INSERTED

Definition at line 74 of file sd_mmc_spi_mem.c.

Referenced by sd_mmc_spi_test_unit_ready().


Generated on Fri Feb 19 02:24:01 2010 for AVR32 UC3 - SD/MMC Driver by  doxygen 1.5.5