Nut/OS  5.0.5
API Reference
Multimedia Card Driver

Block device driver for MM/SD Cards. More...

Collaboration diagram for Multimedia Card Driver:

Data Structures

struct  _MMC_CSD
 Multimedia card identification register. More...
struct  _MEMCARDSUPP
 Memory card support structure. More...
struct  _MMCIFC
 Low level access information structure. More...
struct  _MMC_CID
 Multimedia card identification register. More...
struct  _MMCFCB
 Local multimedia card mount information. More...

Defines

#define NUTMC_SF_CD   0x01
#define NUTMC_SF_WP   0x02
#define NUTMC_IND_OFF   0
#define NUTMC_IND_READ   1
#define NUTMC_IND_WRITE   2
#define NUTMC_IND_ERROR   4
#define MMCMD_HOST   0x40
#define MMCMD_RESET_CRC   0x95
#define MMCMD_GO_IDLE_STATE   0
 Reset card to idle state.
#define MMCMD_SEND_OP_COND   1
 Activate card's initialization process.
#define MMCMD_ALL_SEND_CID   2
 Send operation condition register.
#define MMCMD_SEND_RELATIVE_ADDR   3
 Assign relative card address.
#define MMCMD_SELECT_CARD   7
 Assign relative card address.
#define MMCMD_SEND_EXTCSD   8
 Query card's extended CSD.
#define MMCMD_SEND_CSD   9
 Query card's CSD.
#define MMCMD_SEND_CID   10
 Query card's CID.
#define MMCMD_STOP_TRANSMISSION   12
 Stop multiple block transmission.
#define MMCMD_SEND_STATUS   13
 Query card's status register.
#define MMCMD_SET_BLOCKLEN   16
 Select block length for following read/write commands.
#define MMCMD_READ_SINGLE_BLOCK   17
 Initiate single block read.
#define MMCMD_READ_MULTIPLE_BLOCK   18
 Initiate continuous block read.
#define MMCMD_WRITE_BLOCK   24
 Initiate single block write.
#define MMCMD_WRITE_MULTIPLE_BLOCK   25
 Initiate continuous block write.
#define MMCMD_PROGRAM_CSD   27
 Initiate programming of programmable CSD bits.
#define MMCMD_SET_WRITE_PROTECT   28
 Enable card's optional write protection.
#define MMCMD_CLR_WRITE_PROTECT   29
 Disable card's write protection.
#define MMCMD_SEND_WRITE_PROTECT   30
 Query card's write protect status.
#define MMCMD_TAG_ERASE_GROUP_START   35
 Set address of the first erase group.
#define MMCMD_TAG_ERASE_GROUP_END   36
 Set address of the last erase group.
#define MMCMD_ERASE   38
 Erase previously selected sectors.
#define MMCMD_SEND_APP_OP_COND   41
 Activate SD card's initialization process.
#define MMCMD_LOCK_UNLOCK   42
 Set/clear password or lock/unlock the card.
#define MMCMD_SEND_APP_CMD   55
 Application command follows.
#define MMCMD_READ_OCR   58
 Query card's operating condition register.
#define MMCMD_CRC_ON_OFF   59
 Enable or disable CRC mode.
#define MMR1_IDLE_STATE   0x00
 Card is idle.
#define MMR1_NOT_IDLE   0x01
 Card is busy.
#define MMR1_ERASE_RESET   0x02
 Erase sequence was cleared before execution.
#define MMR1_ILLEGAL_COMMAND   0x04
 Illegal command code detected.
#define MMR1_COM_CRC_ERROR   0x08
 Bad command CRC detected.
#define MMR1_ERASE_SEQ_ERROR   0x10
 Bad erase sequence.
#define MMR1_ADDRESS_ERROR   0x20
 Misaligned address did not match block length.
#define MMR1_PARAMETER_ERROR   0x40
 Command parameter is out of range.
#define MMR2_CARD_LOCKED   0x01
 Card is locked.
#define MMR2_WP_ERASE_SKIP   0x02
 Erasing write protected sector or password error.
#define MMR2_ERROR   0x04
 General or unknown error occured.
#define MMR2_CC_ERROR   0x08
 Internal card controller error.
#define MMR2_ECC_FAILED   0x10
 Bad internal ECC.
#define MMR2_WP_VIOLATION   0x20
 Failed to write to protected block.
#define MMR2_ERASE_PARAMETER   0x40
 Invalid erase parameter.
#define MMR2_OUT_OF_RANGE   0x80
 Command parameter is out of range.
#define MMCSR_OUT_OF_RANGE   0x80000000
#define MMCSR_ADDRESS_ERROR   0x40000000
#define MMCSR_BLOCK_LEN_ERROR   0x20000000
#define MMCSR_ERASE_SEQ_ERROR   0x10000000
#define MMCSR_ERASE_PARAM   0x08000000
#define MMCSR_WP_VIOLATION   0x04000000
#define MMCSR_COM_CRC_ERROR   0x00800000
#define MMCSR_ILLEGAL_COMMAND   0x00400000
#define MMCSR_ERROR   0x00080000
#define MMCSR_CIDCSD_OVERWRITE   0x00010000
#define MMCSR_WP_ERASE_SKIP   0x00008000
#define MMCSR_CARD_ECC_DISABLED   0x00004000
#define MMCSR_ERASE_RESET   0x00002000
#define MMCSR_STATE_MASK   0x00001E00
#define MMCSR_READY_FOR_DATA   0x00000100
#define MMCSR_IS_IDLE   0x00000000
#define MMCSR_IS_READY   0x00000200
#define MMCSR_IS_IDENT   0x00000400
#define MMCSR_IS_STBY   0x00000600
#define MMCSR_IS_TRAN   0x00000800
#define MMCSR_IS_DATA   0x00000A00
#define MMCSR_IS_RCV   0x00000C00
#define MMCSR_IS_PRG   0x00000E00
#define MMCSR_IS_DIS   0x00001000
#define MMDR_ACCEPTED
#define MMDR_CRC_ERROR
#define MMDR_WRITE_ERROR
#define MMCERR_TIMEOUT   0x00000001
#define MMCOP_NBUSY   0x80000000
#define MMCARD_CIDR_SIZE   16
 Number of bytes in the CID register.
#define MMCARD_CSDR_SIZE   16
 Number of bytes in the CSD register.
#define MMCARD_OCR_SIZE   32
 Number of bytes in the operating condition register.
#define MMC_BLOCK_SIZE   512
 Block size.
#define MMC_MAX_INIT_POLLS   512
 Card init timeout.
#define MMC_MAX_RESET_POLLS   255
 Card reset timeout.
#define MMC_MAX_WRITE_POLLS   1024
 Card write timeout.
#define MMC_MAX_WRITE_RETRIES   32
 Card write retries.
#define MMC_MAX_READ_RETRIES   8
 Card read retries.
#define MMC_MAX_REG_POLLS   512
 Register read timeout.
#define MMC_MAX_CMDACK_POLLS   1024
 Command acknowledge timeout.
#define MMC_MAX_R1_POLLS   1024
 R1 response timeout.
#define MMC_BLOCK_SIZE   512
 Block size.
#define MMC_MAX_INIT_POLLS   512
 Card init timeout.
#define MMC_MAX_RESET_RETRIES   2
 Card reset timeout.
#define MMC_MAX_WRITE_RETRIES   2
 Card write retries.
#define MMC_MAX_READ_RETRIES   MMC_MAX_WRITE_RETRIES
 Card read retries.
#define MMC_MAX_CMDACK_POLLS   1024
 Command acknowledge timeout.
#define MMC_MAX_READY_POLLS   800
 Card busy timeout.

Typedefs

typedef struct _MEMCARDSUPP MEMCARDSUPP
 Memory card support structure.
typedef struct _MMCIFC MMCIFC
 Low level access information structure.
typedef struct _MMC_CID MMC_CID
 Multimedia card identification register.
typedef struct _MMC_CSD MMC_CSD
 Multimedia card identification register.
typedef struct _MMCFCB MMCFCB
 Local multimedia card mount information.
typedef struct _MMCFCB MMCFCB
 Local multimedia card status information.

Functions

int MmCardBlockRead (NUTFILE *nfp, void *buffer, int num)
 Read data blocks from a mounted partition.
int MmCardBlockWrite (NUTFILE *nfp, const void *buffer, int num)
 Write data blocks to a mounted partition.
int MmCardBlockWrite_P (NUTFILE *nfp, PGM_P buffer, int num)
 Write data blocks from program space to a mounted partition.
NUTFILEMmCardMount (NUTDEVICE *dev, const char *name, int mode, int acc)
 Mount a partition.
int MmCardUnmount (NUTFILE *nfp)
 Unmount a previously mounted partition.
int MmCardIOCtl (NUTDEVICE *dev, int req, void *conf)
 Perform MMC control functions.
int MmCardDevInit (NUTDEVICE *dev)
 Initialize high level MMC driver.
int SpiMmcBlockRead (NUTFILE *nfp, void *buffer, int num)
 Read data blocks from a mounted partition.
int SpiMmcBlockWrite (NUTFILE *nfp, const void *buffer, int num)
 Write data blocks to a mounted partition.
int SpiMmcBlockWrite_P (NUTFILE *nfp, PGM_P buffer, int num)
 Write data blocks from program space to a mounted partition.
int SpiMmcUnmount (NUTFILE *nfp)
 Unmount a previously mounted partition.
NUTFILESpiMmcMount (NUTDEVICE *dev, const char *name, int mode, int acc)
 Mount a partition.
int SpiMmcIOCtl (NUTDEVICE *dev, int req, void *conf)
 Perform MMC control functions.
int SpiMmcInit (NUTDEVICE *dev)
 Initialize MMC driver.

Variables

u_char _MMC_CSD::mmcsd_spec
 Card specification.
u_char _MMC_CSD::mmcsd_taac
 Data read access time.
u_char _MMC_CSD::mmcsd_nsac
 Data read access time 2.
u_char _MMC_CSD::mmcsd_speed
 Maximum data transfer rate.
u_char _MMC_CSD::mmcsd_ccc_bl [2]
 Card command classes and max. read block length.
u_char _MMC_CSD::mmcsd_rfld [8]
 Read-only fields.
u_char _MMC_CSD::mmcsd_pfld
 Programmable field.
u_char _MMC_CSD::mmcsd_crc
 Checksum.

Control Codes

typedef struct _MMC_CSD MMC_CSD
 Multimedia card identification register.
#define MMCARD_GETSTATUS   0x2001
 Retrieve card status.
#define MMCARD_GETOCR   0x2002
 Retrieve operation condition register.
#define MMCARD_GETCID   0x2003
 Retrieve card identification.
#define MMCARD_GETCSD   0x2004
 Retrieve card specific data.
#define MMCARD_GETEXTCSD   0x2005
 Retrieve extended card specific data.

Voltage Ranges

#define MMCARD_165_195V   0x00000080
#define MMCARD_20_21V   0x00000100
#define MMCARD_21_22V   0x00000200
#define MMCARD_22_23V   0x00000400
#define MMCARD_23_24V   0x00000800
#define MMCARD_24_25V   0x00001000
#define MMCARD_25_26V   0x00002000
#define MMCARD_26_27V   0x00004000
#define MMCARD_27_28V   0x00008000
#define MMCARD_28_29V   0x00010000
#define MMCARD_29_30V   0x00020000
#define MMCARD_30_31V   0x00040000
#define MMCARD_31_32V   0x00080000
#define MMCARD_32_33V   0x00100000
#define MMCARD_33_34V   0x00200000
#define MMCARD_34_35V   0x00400000
#define MMCARD_35_36V   0x00800000

Control Codes

#define MMCARD_GETSTATUS   0x2001
 Retrieve card status.
#define MMCARD_GETOCR   0x2002
 Retrieve operation condition register.
#define MMCARD_GETCID   0x2003
 Retrieve card identification.
#define MMCARD_GETCSD   0x2004
 Retrieve card specific data.
#define MMCARD_GETEXTCSD   0x2005
 Retrieve extended card specific data.

Detailed Description

Block device driver for MM/SD Cards.

Basic SPI bus block device driver for multimedia cards.

Basic block device driver for multimedia cards.

The driver uses SPI mode, but doesn't include any low level hardware access. This must be provided by some additional routines.

 *
 * $Log$
 * Revision 1.15  2009/02/13 14:52:05  haraldkipp
 * Include memdebug.h for heap management debugging support.
 *
 * Revision 1.14  2009/02/06 15:40:29  haraldkipp
 * Using newly available strdup() and calloc().
 * Replaced NutHeap routines by standard malloc/free.
 * Replaced pointer value 0 by NULL.
 *
 * Revision 1.13  2009/01/17 11:26:46  haraldkipp
 * Getting rid of two remaining BSD types in favor of stdint.
 * Replaced 'u_int' by 'unsinged int' and 'uptr_t' by 'uintptr_t'.
 *
 * Revision 1.12  2008/08/11 06:59:42  haraldkipp
 * BSD types replaced by stdint types (feature request #1282721).
 *
 * Revision 1.11  2008/07/14 13:09:30  haraldkipp
 * Allow small MultiMedia Cards without partition table.
 *
 * Revision 1.10  2007/08/30 12:15:06  haraldkipp
 * Configurable MMC timings.
 *
 * Revision 1.9  2006/10/08 16:48:09  haraldkipp
 * Documentation fixed
 *
 * Revision 1.8  2006/07/05 08:03:12  haraldkipp
 * Bugfix. Trailing slash in mount path not properly handled.
 * Thanks to Michael Fischer.
 *
 * Revision 1.7  2006/06/18 16:34:46  haraldkipp
 * Mutex deadlock fixed.
 *
 * Revision 1.6  2006/05/25 09:34:21  haraldkipp
 * Added mutual exclusion lock for multithreaded access.
 *
 * Revision 1.5  2006/04/07 12:29:03  haraldkipp
 * Number of read retries increased. Memory hole fixed.
 * Added ioctl(NUTBLKDEV_MEDIAAVAIL).
 * Card change ioctl() will also return 1 if no card is available.
 *
 * Revision 1.4  2006/02/23 15:43:56  haraldkipp
 * Timeout value increased. Some cards have long write latencies.
 *
 * Revision 1.3  2006/01/22 17:36:31  haraldkipp
 * Some cards need more time to enter idle state.
 * Card access now returns an error after card change detection.
 *
 * Revision 1.2  2006/01/19 18:40:08  haraldkipp
 * Timeouts increased and long time sleeps decreased for better performance.
 *
 * Revision 1.1  2006/01/05 16:30:49  haraldkipp
 * First check-in.
 *
 *
 * 

The driver provides generic memory card access, but doesn't include low level hardware support like card detection. This must be provided by a hardware specific support module.

 *
 * $Id$
 *
 * 

Define Documentation

#define MMCARD_GETSTATUS   0x2001

Retrieve card status.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMCARD_GETOCR   0x2002

Retrieve operation condition register.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMCARD_GETCID   0x2003

Retrieve card identification.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMCARD_GETCSD   0x2004

Retrieve card specific data.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMCARD_GETEXTCSD   0x2005

Retrieve extended card specific data.

Referenced by SpiMmcIOCtl().

#define NUTMC_SF_CD   0x01

Referenced by SpiMmcIOCtl(), and SpiMmcMount().

#define NUTMC_SF_WP   0x02
#define NUTMC_IND_OFF   0
#define NUTMC_IND_READ   1

Referenced by SpiMmcBlockRead().

#define NUTMC_IND_WRITE   2

Referenced by SpiMmcBlockWrite().

#define NUTMC_IND_ERROR   4
#define MMCMD_HOST   0x40
#define MMCMD_RESET_CRC   0x95
#define MMCMD_GO_IDLE_STATE   0

Reset card to idle state.

In idle state the card will not accept any other commands than MMCMD_SEND_OP_COND or MMCMD_READ_OCR.

#define MMCMD_SEND_OP_COND   1

Activate card's initialization process.

#define MMCMD_ALL_SEND_CID   2

Send operation condition register.

Queries the operation condition register content from all cards, which are in idle state.

#define MMCMD_SEND_RELATIVE_ADDR   3

Assign relative card address.

#define MMCMD_SELECT_CARD   7

Assign relative card address.

#define MMCMD_SEND_EXTCSD   8

Query card's extended CSD.

Referenced by SpiMmcIOCtl().

#define MMCMD_SEND_CSD   9

Query card's CSD.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMCMD_SEND_CID   10

Query card's CID.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMCMD_STOP_TRANSMISSION   12

Stop multiple block transmission.

#define MMCMD_SEND_STATUS   13

Query card's status register.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMCMD_SET_BLOCKLEN   16

Select block length for following read/write commands.

#define MMCMD_READ_SINGLE_BLOCK   17

Initiate single block read.

Referenced by SpiMmcBlockRead(), and SpiMmcMount().

#define MMCMD_READ_MULTIPLE_BLOCK   18

Initiate continuous block read.

#define MMCMD_WRITE_BLOCK   24

Initiate single block write.

Referenced by SpiMmcBlockWrite().

#define MMCMD_WRITE_MULTIPLE_BLOCK   25

Initiate continuous block write.

Referenced by SpiMmcBlockWrite().

#define MMCMD_PROGRAM_CSD   27

Initiate programming of programmable CSD bits.

#define MMCMD_SET_WRITE_PROTECT   28

Enable card's optional write protection.

#define MMCMD_CLR_WRITE_PROTECT   29

Disable card's write protection.

#define MMCMD_SEND_WRITE_PROTECT   30

Query card's write protect status.

#define MMCMD_TAG_ERASE_GROUP_START   35

Set address of the first erase group.

#define MMCMD_TAG_ERASE_GROUP_END   36

Set address of the last erase group.

#define MMCMD_ERASE   38

Erase previously selected sectors.

#define MMCMD_SEND_APP_OP_COND   41

Activate SD card's initialization process.

#define MMCMD_LOCK_UNLOCK   42

Set/clear password or lock/unlock the card.

#define MMCMD_SEND_APP_CMD   55

Application command follows.

#define MMCMD_READ_OCR   58

Query card's operating condition register.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMCMD_CRC_ON_OFF   59

Enable or disable CRC mode.

In SPI mode CRC is disabled by default.

#define MMR1_IDLE_STATE   0x00

Card is idle.

Referenced by MmCardIOCtl(), and SpiMmcIOCtl().

#define MMR1_NOT_IDLE   0x01

Card is busy.

#define MMR1_ERASE_RESET   0x02

Erase sequence was cleared before execution.

#define MMR1_ILLEGAL_COMMAND   0x04

Illegal command code detected.

#define MMR1_COM_CRC_ERROR   0x08

Bad command CRC detected.

#define MMR1_ERASE_SEQ_ERROR   0x10

Bad erase sequence.

#define MMR1_ADDRESS_ERROR   0x20

Misaligned address did not match block length.

#define MMR1_PARAMETER_ERROR   0x40

Command parameter is out of range.

#define MMR2_CARD_LOCKED   0x01

Card is locked.

#define MMR2_WP_ERASE_SKIP   0x02

Erasing write protected sector or password error.

#define MMR2_ERROR   0x04

General or unknown error occured.

#define MMR2_CC_ERROR   0x08

Internal card controller error.

#define MMR2_ECC_FAILED   0x10

Bad internal ECC.

#define MMR2_WP_VIOLATION   0x20

Failed to write to protected block.

#define MMR2_ERASE_PARAMETER   0x40

Invalid erase parameter.

#define MMR2_OUT_OF_RANGE   0x80

Command parameter is out of range.

#define MMCSR_OUT_OF_RANGE   0x80000000
#define MMCSR_ADDRESS_ERROR   0x40000000
#define MMCSR_BLOCK_LEN_ERROR   0x20000000
#define MMCSR_ERASE_SEQ_ERROR   0x10000000
#define MMCSR_ERASE_PARAM   0x08000000
#define MMCSR_WP_VIOLATION   0x04000000
#define MMCSR_COM_CRC_ERROR   0x00800000
#define MMCSR_ILLEGAL_COMMAND   0x00400000
#define MMCSR_ERROR   0x00080000
#define MMCSR_CIDCSD_OVERWRITE   0x00010000
#define MMCSR_WP_ERASE_SKIP   0x00008000
#define MMCSR_CARD_ECC_DISABLED   0x00004000
#define MMCSR_ERASE_RESET   0x00002000
#define MMCSR_STATE_MASK   0x00001E00
#define MMCSR_READY_FOR_DATA   0x00000100
#define MMCSR_IS_IDLE   0x00000000
#define MMCSR_IS_READY   0x00000200
#define MMCSR_IS_IDENT   0x00000400
#define MMCSR_IS_STBY   0x00000600
#define MMCSR_IS_TRAN   0x00000800
#define MMCSR_IS_DATA   0x00000A00
#define MMCSR_IS_RCV   0x00000C00
#define MMCSR_IS_PRG   0x00000E00
#define MMCSR_IS_DIS   0x00001000
#define MMDR_ACCEPTED
#define MMDR_CRC_ERROR
#define MMDR_WRITE_ERROR
#define MMCERR_TIMEOUT   0x00000001
#define MMCOP_NBUSY   0x80000000
#define MMCARD_CIDR_SIZE   16

Number of bytes in the CID register.

#define MMCARD_CSDR_SIZE   16

Number of bytes in the CSD register.

#define MMCARD_OCR_SIZE   32

Number of bytes in the operating condition register.

#define MMCARD_165_195V   0x00000080
#define MMCARD_20_21V   0x00000100
#define MMCARD_21_22V   0x00000200
#define MMCARD_22_23V   0x00000400
#define MMCARD_23_24V   0x00000800
#define MMCARD_24_25V   0x00001000
#define MMCARD_25_26V   0x00002000
#define MMCARD_26_27V   0x00004000
#define MMCARD_27_28V   0x00008000
#define MMCARD_28_29V   0x00010000
#define MMCARD_29_30V   0x00020000
#define MMCARD_30_31V   0x00040000
#define MMCARD_31_32V   0x00080000
#define MMCARD_32_33V   0x00100000
#define MMCARD_33_34V   0x00200000
#define MMCARD_34_35V   0x00400000
#define MMCARD_35_36V   0x00800000
#define MMCARD_GETSTATUS   0x2001

Retrieve card status.

#define MMCARD_GETOCR   0x2002

Retrieve operation condition register.

#define MMCARD_GETCID   0x2003

Retrieve card identification.

#define MMCARD_GETCSD   0x2004

Retrieve card specific data.

#define MMCARD_GETEXTCSD   0x2005

Retrieve extended card specific data.

#define MMC_BLOCK_SIZE   512

Block size.

Block size in bytes. Do not change unless you are sure that both, the file system and the hardware support it.

#define MMC_MAX_INIT_POLLS   512

Card init timeout.

Max. number of loops waiting for card's idle mode after initialization. An additional delay of 1 ms is added to each loop after one quarter of this value elapsed.

#define MMC_MAX_RESET_POLLS   255

Card reset timeout.

Max. number of loops waiting for card's idle mode after resetting it.

#define MMC_MAX_WRITE_POLLS   1024

Card write timeout.

Max. number of loops waiting for card's idle mode after resetting it. An additional delay of 1 ms is added to each loop after 31/32 of this value elapsed.

#define MMC_MAX_WRITE_RETRIES   32

Card write retries.

Max. number of retries while writing.

#define MMC_MAX_READ_RETRIES   8

Card read retries.

Max. number of retries while reading.

Referenced by MmCardBlockRead(), and MmCardBlockWrite().

#define MMC_MAX_REG_POLLS   512

Register read timeout.

Max. number of loops while reading a card's register.

#define MMC_MAX_CMDACK_POLLS   1024

Command acknowledge timeout.

Max. number of loops waiting for card's acknowledge of a command. An additional delay of 1 ms is added to each loop after three quarter of this value elapsed.

#define MMC_MAX_R1_POLLS   1024

R1 response timeout.

Max. number of loops waiting for card's R1 response.

#define MMC_BLOCK_SIZE   512

Block size.

Block size in bytes. Do not change unless you are sure that both, the file system and the hardware support it.

Referenced by SpiMmcBlockRead(), SpiMmcBlockWrite(), SpiMmcInit(), SpiMmcIOCtl(), and SpiMmcMount().

#define MMC_MAX_INIT_POLLS   512

Card init timeout.

Max. number of loops waiting for card's idle mode after initialization. An additional delay of 1 ms is added to each loop after one quarter of this value elapsed.

#define MMC_MAX_RESET_RETRIES   2

Card reset timeout.

Max. number of loops waiting for card's idle mode after resetting it.

#define MMC_MAX_WRITE_RETRIES   2

Card write retries.

Max. number of retries while writing.

#define MMC_MAX_READ_RETRIES   MMC_MAX_WRITE_RETRIES

Card read retries.

Max. number of retries while reading.

#define MMC_MAX_CMDACK_POLLS   1024

Command acknowledge timeout.

Max. number of loops waiting for card's acknowledge of a command. An additional delay of 1 ms is added to each loop after three quarter of this value elapsed.

#define MMC_MAX_READY_POLLS   800

Card busy timeout.

Max. number of loops waiting for card's ready state. An additional delay of 1 ms is added to each loop after one quarter of this value elapsed.


Typedef Documentation

typedef struct _MMC_CSD MMC_CSD

Multimedia card identification register.

typedef struct _MEMCARDSUPP MEMCARDSUPP

Memory card support structure.

typedef struct _MMCIFC MMCIFC

Low level access information structure.

typedef struct _MMC_CID MMC_CID

Multimedia card identification register.

typedef struct _MMC_CSD MMC_CSD

Multimedia card identification register.

typedef struct _MMCFCB MMCFCB

Local multimedia card mount information.

typedef struct _MMCFCB MMCFCB

Local multimedia card status information.


Function Documentation

int MmCardBlockRead ( NUTFILE nfp,
void *  buffer,
int  num 
)

Read data blocks from a mounted partition.

Applications should not call this function directly, but use the stdio interface.

Parameters:
nfpPointer to a NUTFILE structure, obtained by a previous call to MmCardMount().
bufferPointer to the data buffer to fill.
numMaximum number of blocks to read. However, reading multiple blocks is not yet supported by this driver.
Returns:
The number of blocks actually read. A return value of -1 indicates an error.

References _MMCFCB::fcb_blkbuf, _MMCFCB::fcb_blknum, _MMCFCB::fcb_part, MMC_MAX_READ_RETRIES, _MMCIFC::mmcifc_cd, _NUTFILE::nf_dev, _NUTFILE::nf_fcb, and _DOSPART::part_sect_offs.

int MmCardBlockWrite ( NUTFILE nfp,
const void *  buffer,
int  num 
)

Write data blocks to a mounted partition.

Applications should not call this function directly, but use the stdio interface.

Parameters:
nfpPointer to a NUTFILE structure, obtained by a previous call to MmCardMount().
bufferPointer to the data to be written.
numMaximum number of blocks to write. However, writing multiple blocks is not yet supported by this driver.
Returns:
The number of blocks written. A return value of -1 indicates an error.

References _MMCFCB::fcb_blkbuf, _MMCFCB::fcb_blknum, _MMCFCB::fcb_part, MMC_MAX_READ_RETRIES, _MMCIFC::mmcifc_cd, _NUTFILE::nf_dev, _NUTFILE::nf_fcb, and _DOSPART::part_sect_offs.

int MmCardBlockWrite_P ( NUTFILE nfp,
PGM_P  buffer,
int  num 
)

Write data blocks from program space to a mounted partition.

This function is not yet implemented and will always return -1.

Similar to MmCardBlockWrite() except that the data is located in program memory.

Applications should not call this function directly, but use the stdio interface.

Parameters:
nfpFile pointer to a previously opened device.
bufferPointer to the data bytes in program space to be written.
numMaximum number of blocks to write. However, writing multiple blocks is not yet supported by this driver.
Returns:
The number of blocks written. A return value of -1 indicates an error.
NUTFILE* MmCardMount ( NUTDEVICE dev,
const char *  name,
int  mode,
int  acc 
)

Mount a partition.

Nut/OS doesn't provide specific routines for mounting. Instead routines for opening files are used.

Applications should not directly call this function, but use the high level stdio routines for opening a file.

Parameters:
devPointer to the MMC device.
namePartition number followed by a slash followed by a name of the file system device. Both items are optional. If no file system driver name is given, the first file system driver found in the list of registered devices will be used. If no partition number is specified or if partition zero is given, the first active primary partition will be used.
modeOpening mode. Currently ignored, but should be used for compatibility with future enhancements.
accFile attributes, ignored.
Returns:
Pointer to a newly created file pointer to the mounted partition or NUTFILE_EOF in case of any error.

References atoi(), calloc, _NUTDEVICE::dev_icb, _NUTDEVICE::dev_ioctl, _NUTDEVICE::dev_name, _NUTDEVICE::dev_next, _NUTDEVICE::dev_type, DOSPART_MAGICPOS, DOSPART_SECTORPOS, DOSPART_TYPEPOS, ENODEV, ENOMEM, errno, _MMCFCB::fcb_blkbuf, _MMCFCB::fcb_fsdev, _MMCFCB::fcb_part, free(), FS_VOL_MOUNT, IFTYP_FS, MmCardUnmount(), _MMCIFC::mmcifc_cd, _NUTFILE::nf_dev, _NUTFILE::nf_fcb, _NUTFILE::nf_next, nutDeviceList, NUTFILE_EOF, NutHeapAlloc, _DOSPART::part_sect_offs, _DOSPART::part_sects, _DOSPART::part_state, _DOSPART::part_type, printf, PTYPE_EMPTY, PTYPE_FAT12, and strcmp().

Here is the call graph for this function:

int MmCardUnmount ( NUTFILE nfp)

Unmount a previously mounted partition.

Applications should not directly call this function, but use the high level stdio routines for closing a previously opened file.

Returns:
0 on success, -1 otherwise.

References _NUTDEVICE::dev_icb, _NUTDEVICE::dev_ioctl, _MMCFCB::fcb_fsdev, free(), FS_VOL_UNMOUNT, _MMCIFC::mmcifc_cd, _NUTFILE::nf_dev, _NUTFILE::nf_fcb, NULL, and rc.

Referenced by MmCardMount().

Here is the call graph for this function:

int MmCardIOCtl ( NUTDEVICE dev,
int  req,
void *  conf 
)

Perform MMC control functions.

This function is called by the ioctl() function of the C runtime library. Applications should not directly call this function.

Todo:
Card change detection should verify the serial card number.
Parameters:
devIdentifies the device that receives the device-control function.
reqRequested control function. May be set to one of the following constants:
confPoints to a buffer that contains any data required for the given control function or receives data from that function.
Returns:
0 on success, -1 otherwise.

References _NUTDEVICE::dev_icb, _MMCFCB::fcb_blkbuf, _MMCFCB::fcb_blknum, _MMCFCB::fcb_part, MMCARD_GETCID, MMCARD_GETCSD, MMCARD_GETOCR, MMCARD_GETSTATUS, _MMCIFC::mmcifc_cd, MMCMD_READ_OCR, MMCMD_SEND_CID, MMCMD_SEND_CSD, MMCMD_SEND_STATUS, MMR1_IDLE_STATE, _NUTFILE::nf_fcb, NUTBLKDEV_INFO, NUTBLKDEV_MEDIAAVAIL, NUTBLKDEV_MEDIACHANGE, NUTBLKDEV_SEEK, NutEventPost(), NutEventWait(), _BLKPAR_INFO::par_blkbp, _BLKPAR_SEEK::par_blknum, _BLKPAR_INFO::par_blksz, _BLKPAR_INFO::par_nblks, _BLKPAR_SEEK::par_nfp, _BLKPAR_INFO::par_nfp, _DOSPART::part_sects, and rc.

Here is the call graph for this function:

int MmCardDevInit ( NUTDEVICE dev)

Initialize high level MMC driver.

Applications should not directly call this function. It is automatically executed during during device registration by NutRegisterDevice().

Parameters:
devIdentifies the device to initialize.
Returns:
Always zero.
int SpiMmcBlockRead ( NUTFILE nfp,
void *  buffer,
int  num 
)

Read data blocks from a mounted partition.

Applications should not call this function directly, but use the stdio interface.

Parameters:
nfpPointer to a NUTFILE structure, obtained by a previous call to SpiMmcMount().
bufferPointer to the data buffer to fill.
numMaximum number of blocks to read. However, reading multiple blocks is not yet supported by this driver.
Returns:
The number of blocks actually read. A return value of -1 indicates an error.

References _NUTDEVICE::dev_dcb, _NUTDEVICE::dev_icb, _MMCFCB::fcb_address, _MMCFCB::fcb_blkbuf, _MEMCARDSUPP::mcs_act, _MEMCARDSUPP::mcs_cf, MMC_BLOCK_SIZE, MMCMD_READ_SINGLE_BLOCK, _NUTFILE::nf_dev, _NUTFILE::nf_fcb, NULL, NUTASSERT, NUTMC_IND_ERROR, NUTMC_IND_OFF, and NUTMC_IND_READ.

int SpiMmcBlockWrite ( NUTFILE nfp,
const void *  buffer,
int  num 
)

Write data blocks to a mounted partition.

Applications should not call this function directly, but use the stdio interface.

Parameters:
nfpPointer to a NUTFILE structure, obtained by a previous call to SpiMmcMount().
bufferPointer to the data to be written. However, writing multiple blocks is not yet supported by this driver.
numNumber of blocks to write.
Returns:
The number of blocks written. A return value of -1 indicates an error.

References _NUTSPIBUS::bus_release, _NUTSPIBUS::bus_transfer, _NUTDEVICE::dev_dcb, _NUTDEVICE::dev_icb, _MMCFCB::fcb_address, _MMCFCB::fcb_blkbuf, _MEMCARDSUPP::mcs_act, _MEMCARDSUPP::mcs_cf, MMC_BLOCK_SIZE, MMCMD_WRITE_BLOCK, MMCMD_WRITE_MULTIPLE_BLOCK, _NUTFILE::nf_dev, _NUTFILE::nf_fcb, _NUTSPINODE::node_bus, NULL, NUTASSERT, NUTMC_IND_ERROR, NUTMC_IND_OFF, and NUTMC_IND_WRITE.

int SpiMmcBlockWrite_P ( NUTFILE nfp,
PGM_P  buffer,
int  num 
)

Write data blocks from program space to a mounted partition.

This function is not yet implemented and will always return -1.

Similar to SpiMmcBlockWrite() except that the data is located in program memory.

Applications should not call this function directly, but use the stdio interface.

Parameters:
nfpFile pointer to a previously opened device.
bufferPointer to the data bytes in program space to be written.
numMaximum number of blocks to write. However, writing multiple blocks is not yet supported by this driver.
Returns:
The number of blocks written. A return value of -1 indicates an error.
int SpiMmcUnmount ( NUTFILE nfp)

Unmount a previously mounted partition.

Applications should not directly call this function, but use the high level stdio routines for closing a previously opened volume.

Parameters:
nfpPointer to a NUTFILE structure, obtained by a previous call to SpiMmcMount().
Returns:
0 on success, -1 otherwise.

References _NUTDEVICE::dev_ioctl, _MMCFCB::fcb_fsdev, free(), FS_VOL_UNMOUNT, _NUTFILE::nf_fcb, NULL, NUTASSERT, and rc.

Referenced by SpiMmcMount().

Here is the call graph for this function:

NUTFILE* SpiMmcMount ( NUTDEVICE dev,
const char *  name,
int  mode,
int  acc 
)

Mount a partition.

Nut/OS doesn't provide specific routines for mounting. Instead routines for opening files are used.

Applications should not directly call this function, but use the high level stdio routines for opening a file.

Parameters:
devPointer to the MMC device.
namePartition number followed by a slash followed by a name of the file system device. Both items are optional. If no file system driver name is given, the first file system driver found in the list of registered devices will be used. If no partition number is specified or if partition zero is given, the first active primary partition will be used.
modeOpening mode. Currently ignored, but should be used for compatibility with future enhancements.
accFile attributes, ignored.
Returns:
Pointer to a newly created file pointer to the mounted partition or NUTFILE_EOF in case of any error.

References atoi(), calloc, _NUTDEVICE::dev_dcb, _NUTDEVICE::dev_icb, _NUTDEVICE::dev_ioctl, _NUTDEVICE::dev_name, _NUTDEVICE::dev_next, _NUTDEVICE::dev_type, DOSPART_MAGICPOS, DOSPART_SECTORPOS, DOSPART_TYPEPOS, ENODEV, ENOMEM, errno, _MMCFCB::fcb_blkbuf, _MMCFCB::fcb_fsdev, _MMCFCB::fcb_part, free(), FS_VOL_MOUNT, IFTYP_FS, _MEMCARDSUPP::mcs_cf, _MEMCARDSUPP::mcs_sf, MMC_BLOCK_SIZE, MMCMD_READ_SINGLE_BLOCK, _NUTFILE::nf_dev, _NUTFILE::nf_fcb, _NUTFILE::nf_next, NUTDEBUG, nutDeviceList, NUTFILE_EOF, NutHeapAlloc, NUTMC_SF_CD, _DOSPART::part_sect_offs, _DOSPART::part_sects, _DOSPART::part_state, _DOSPART::part_type, printf, PTYPE_EMPTY, PTYPE_FAT12, SpiMmcUnmount(), and strcmp().

Here is the call graph for this function:

int SpiMmcIOCtl ( NUTDEVICE dev,
int  req,
void *  conf 
)

Perform MMC control functions.

This function is called by the ioctl() function of the C runtime library. Applications should not directly call this function.

Todo:
Card change detection should verify the serial card number.
Parameters:
devIdentifies the device that receives the device-control function.
reqRequested control function. May be set to one of the following constants:
confPoints to a buffer that contains any data required for the given control function or receives data from that function.
Returns:
0 on success, -1 otherwise.

References _NUTSPIBUS::bus_release, _NUTSPIBUS::bus_transfer, _NUTDEVICE::dev_dcb, _NUTDEVICE::dev_icb, _MMCFCB::fcb_address, _MMCFCB::fcb_blkbuf, _MMCFCB::fcb_part, MMC_BLOCK_SIZE, MMCARD_GETCID, MMCARD_GETCSD, MMCARD_GETEXTCSD, MMCARD_GETOCR, MMCARD_GETSTATUS, MMCMD_READ_OCR, MMCMD_SEND_CID, MMCMD_SEND_CSD, MMCMD_SEND_EXTCSD, MMCMD_SEND_STATUS, MMR1_IDLE_STATE, _NUTFILE::nf_fcb, _NUTSPINODE::node_bus, NUTBLKDEV_INFO, NUTBLKDEV_MEDIAAVAIL, NUTBLKDEV_MEDIACHANGE, NUTBLKDEV_SEEK, NUTMC_SF_CD, _BLKPAR_INFO::par_blkbp, _BLKPAR_SEEK::par_blknum, _BLKPAR_INFO::par_blksz, _BLKPAR_INFO::par_nblks, _BLKPAR_SEEK::par_nfp, _BLKPAR_INFO::par_nfp, _DOSPART::part_sect_offs, _DOSPART::part_sects, and rc.

int SpiMmcInit ( NUTDEVICE dev)

Initialize MMC driver.

Applications should not directly call this function. It is automatically executed during during device registration by NutRegisterDevice().

Parameters:
devIdentifies the device to initialize.
Returns:
Always zero.

References memset(), and MMC_BLOCK_SIZE.

Here is the call graph for this function:


Variable Documentation

Card specification.

Data read access time.

Data read access time 2.

Maximum data transfer rate.

Card command classes and max. read block length.

Read-only fields.

  • [0] 0..1 Device size bits 10..11.
  • [0] 2..3 Reserved.
  • [0] 4 DSR implemented.
  • [0] 5 Read block misalignment.
  • [0] 6 Write block misalignment.
  • [0] 7 Partial blocks for read allowed.
  • [1] 0..7 Device size bits 2..9.
  • [2] 0..2 Max. read current at VDD max.
  • [2] 3..5 Max. read current at VDD min.
  • [2] 6..7 Device size bits 0..1.
  • [3] 0..1 Device size multiplier bits 1..2.
  • [3] 2..4 Max. write current at VDD max.
  • [3] 5..7 Max. write current at VDD min.
  • [4] 0..1 Erase group size multiplier bits 3..4.
  • [4] 2..6 Erase group size.
  • [4] 7 Device size multiplier bit 0.
  • [5] 0..4 Write protect group size.
  • [5] 5..7 Erase group size multiplier bits 0..2.
  • [6] 0..1 Max. write data block length bits 2..3.
  • [6] 2..4 Read to write speed factor.
  • [6] 5..6 Reserved.
  • [6] 7 Write protect group enable.
  • [7] 0 Content protection application.
  • [7] 1..4 Reserved.
  • [7] 5 Partial blocks for write allowed.
  • [7] 6..7 Max. write data block length bits 0..1.

Programmable field.