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.
|
Data Structures |
struct | MMCIFC |
| Low level access information structure. More...
|
struct | MMC_CID |
| Multimedia card identification register. More...
|
struct | MMC_CSD |
| Multimedia card identification register. More...
|
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.
|
Defines |
#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_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.
|
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.
|
NUTFILE * | MmCardMount (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.
|
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:
-
| dev | Pointer to the MMC device. |
| name | Partition 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. |
| mode | Opening mode. Currently ignored, but should be used for compatibility with future enhancements. |
| acc | File attributes, ignored. |
- Returns:
- Pointer to a newly created file pointer to the mounted partition or NUTFILE_EOF in case of any error.
Definition at line 725 of file mmcard.c.
References atoi(), _NUTDEVICE::dev_icb, _NUTDEVICE::dev_ioctl, _NUTDEVICE::dev_name, _NUTDEVICE::dev_next, _NUTDEVICE::dev_type, DOSPART_MAGICPOS, DOSPART_SECTORPOS, DOSPART_TYPEPOS, ENODEV, ENOMEM, errno, FS_VOL_MOUNT, IFTYP_FS, MmCardUnmount(), MMCIFC::mmcifc_cd, _NUTFILE::nf_dev, _NUTFILE::nf_fcb, _NUTFILE::nf_next, nutDeviceList, NUTFILE_EOF, NutHeapAlloc(), NutHeapAllocClear(), NutHeapFree(), DOSPART::part_state, printf, PTYPE_EMPTY, PTYPE_FAT12, and strcmp().