373a8c32b2
git-svn-id: file:///srv/dev-disk-by-uuid-17e88007-4d0c-45e0-8757-cacfcc458630/repositories/svn/Diplomarbeit@55 9fe90eed-be63-e94b-8204-d34ff4c2ff93
534 lines
18 KiB
C
534 lines
18 KiB
C
/* ---------------------------------------------------------------------------
|
||
* mmc.h (c) 2008 Micro-key bv
|
||
* ---------------------------------------------------------------------------
|
||
* Micro-key bv
|
||
* Industrieweg 28, 9804 TG Noordhorn
|
||
* Postbus 92, 9800 AB Zuidhorn
|
||
* The Netherlands
|
||
* Tel: +31 594 503020
|
||
* Fax: +31 594 505825
|
||
* Email: support@microkey.nl
|
||
* Web: www.microkey.nl
|
||
* ---------------------------------------------------------------------------
|
||
* Description:
|
||
* ---------------------------------------------------------------------------
|
||
* Version(s): 0.1, Apr 22, 2008, MMi
|
||
* Creation.
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
#ifndef __MMC_H
|
||
#define __MMC_H
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* System include files.
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
#include "LPC23xx.h"
|
||
#include "types.h"
|
||
/* ---------------------------------------------------------------------------
|
||
* Application include files.
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Constant and macro definitions.
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
#ifdef MMC_GLOBAL
|
||
#define MMC_EXTERN
|
||
#else
|
||
#define MMC_EXTERN extern
|
||
#endif
|
||
|
||
extern void Dly100us(void *arg);
|
||
|
||
#define MMC_DISK_INFO
|
||
#define MMC_DISK_LUN 0
|
||
|
||
/* Hardware depends definitions */
|
||
#define IdentificationModeClock 400000
|
||
#define PC_PCSPI1 (1<<10)
|
||
#define PC_PCSPI0 (1<<8)
|
||
|
||
#define RTC_OSC_FREQ (32768UL)
|
||
|
||
#define RD_TIME_OUT 100LL /* SD Max. Block Read Access Time */
|
||
#define WR_TIME_OUT 250LL /* SD Max. Block Write Access Time */
|
||
|
||
#define OcrReg 0x00FF8000
|
||
|
||
/* Card Status register */
|
||
#define READY_FOR_DATA (1UL << 8)
|
||
#define CURRENT_STATE (0xFUL << 9)
|
||
#define ERASE_RESET (1UL << 13)
|
||
#define CARD_ECC_DISABLED (1UL << 14)
|
||
#define WP_ERASE_SKIP (1UL << 15)
|
||
#define CID_CSD_OVERWRITE (1UL << 16)
|
||
#define ERROR (1UL << 17)
|
||
#define ILLEGAL_COMMAND (1UL << 22)
|
||
#define COM_CRC_ERROR (1UL << 23)
|
||
#define WP_VIOLATION (1UL << 26)
|
||
#define ERASE_PARAM (1UL << 27)
|
||
#define ERASE_SEQ_ERROR (1UL << 28)
|
||
#define BLOCK_LEN_ERROR (1UL << 29)
|
||
#define ADDRESS_ERROR (1UL << 30)
|
||
#define OUT_OF_RANGE (1UL << 31)
|
||
|
||
/* Card states */
|
||
#define CARD_IDLE (0UL << 9)
|
||
#define CARD_READY (1UL << 9)
|
||
#define CARD_IDENT (2UL << 9)
|
||
#define CARD_STBY (3UL << 9)
|
||
#define CARD_TRAN (4UL << 9)
|
||
#define CARD_DATA (5UL << 9)
|
||
#define CARD_RCV (6UL << 9)
|
||
#define CARD_PRG (7UL << 9)
|
||
#define CARD_DIS (8UL << 9)
|
||
|
||
#define MmcDly_1ms(Delay) Dly100us((void*)(10 * Delay))
|
||
|
||
|
||
/* WORKAROUND
|
||
* As long as MCI_CP and MCI_WP are swapped, right PinMapping
|
||
* is done here.
|
||
* After Hardware Update, simply use commented PinMasks instead
|
||
* of the corrected ones.
|
||
*/
|
||
|
||
// MMC/SD card switches
|
||
// Card present
|
||
// \MARK NEW PINSETTINGS FOR TESTER (2) and IO_CTRL (1)
|
||
#if ((PINSET_TESTER == 1) || (PINSET_TESTER == 2))
|
||
#define MMC_CP_MASK (1UL << 4)
|
||
#define MMC_CP_DIR FIO0PIN1
|
||
#define MMC_CP_FDIR FIO0DIR
|
||
#define MMC_CP_IO FIO0PIN1
|
||
#define MMC_CP_FIO FIO0PIN1
|
||
#define MMC_CP_MODE PINMODE1 /* Bit 12&13 */
|
||
#else
|
||
/* Pin 87 (P0.17) */
|
||
#define MMC_CP_MASK (1UL << 1)
|
||
#define MMC_CP_DIR FIO0PIN2
|
||
#define MMC_CP_FDIR FIO0DIR
|
||
#define MMC_CP_IO FIO0PIN2
|
||
#define MMC_CP_FIO FIO0PIN2
|
||
#define MMC_CP_MODE PINMODE1
|
||
#endif
|
||
|
||
|
||
// Card write protect
|
||
// \MARK NEW PINSETTINGS FOR TESTER (2) and IO_CTRL (1)
|
||
#if ((PINSET_TESTER == 1) || (PINSET_TESTER == 2))
|
||
#define MMC_WP_MASK (1UL << 3)
|
||
#define MMC_WP_DIR FIO0DIR
|
||
#define MMC_WP_FDIR FIO0DIR
|
||
#define MMC_WP_IO FIO0PIN1
|
||
#define MMC_WP_FIO FIO0PIN1
|
||
#define MMC_WP_MODE PINMODE1 /* Bit 13&14 */
|
||
#else
|
||
/* Pin 64 (P1.29) */
|
||
#define MMC_WP_MASK (1UL << 5)
|
||
#define MMC_WP_DIR FIO1DIR3
|
||
#define MMC_WP_FDIR FIO1DIR
|
||
#define MMC_WP_IO FIO1PIN3
|
||
#define MMC_WP_FIO FIO1PIN3
|
||
#define MMC_WP_MODE PINMODE3
|
||
#endif
|
||
|
||
|
||
#define DMA_MMCSD 4 /* MMC/SD */
|
||
|
||
#define MCI_PCLK_OFFSET 56
|
||
|
||
#define I_RC_OSC_FREQ (4000000)
|
||
#define MAIN_OSC_FREQ (12000000)
|
||
/* ---------------------------------------------------------------------------
|
||
* Type definitions.
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
|
||
typedef enum _DiskStatusCode_t
|
||
{
|
||
DiskCommandPass = 0, DiskNotReady, DiskNotPresent,
|
||
DiskParametersError, DiskMiscompareError, DiskChanged,
|
||
DiskUknowError,
|
||
} DiskStatusCode_t;
|
||
|
||
typedef enum _DiskIoRequest_t
|
||
{
|
||
DiskWrite = 0, DiskRead, DiskVerify,
|
||
} DiskIoRequest_t;
|
||
|
||
typedef enum _DiskInfoType_t
|
||
{
|
||
DiskInquiry = 0, DiskFormatCapacity,
|
||
} DiskInfoType_t;
|
||
|
||
typedef enum _DiskType_t
|
||
{
|
||
DiskMMC, DiskSD, DiskUnknow,
|
||
} DiskType_t;
|
||
|
||
typedef struct _DiskCtrlBlk_t
|
||
{
|
||
UINT32 BlockNumb;
|
||
UINT32 BlockSize;
|
||
DiskStatusCode_t DiskStatus;
|
||
DiskType_t DiskType;
|
||
BOOLEAN WriteProtect;
|
||
BOOLEAN MediaChanged;
|
||
} DiskCtrlBlk_t, *pDiskCtrlBlk_t;
|
||
|
||
typedef enum _MmcState_t
|
||
{
|
||
MmcOk = 0,
|
||
MmcNoPresent = 1,
|
||
MmcNoResponse = 2 ,
|
||
MmcCardError = 3,
|
||
MmcMiscompare = 4,
|
||
MmcDmaError = 5,
|
||
MmcProtect = 6
|
||
} MmcState_t;
|
||
|
||
typedef enum _MmcSpiCmdInd_t
|
||
{
|
||
CMD0 = 0, /* Resets the MultiMediaCard */
|
||
CMD1, /* Activates card’s init process */
|
||
CMD2, /* Asks all cards to send its card identification (CID) */
|
||
CMD3, /* Set relative address */
|
||
CMD7, /* Select/deselect card the card is selected by its own */
|
||
/* relative address and deselected by other address. */
|
||
/* address 0 deselects all */
|
||
CMD9, /* Asks the card to send its card-specific data (CSD) */
|
||
CMD10, /* Asks the card to send its card identification (CID) */
|
||
CMD12, /* Stop transmission on multiple block read */
|
||
CMD13, /* Asks the selected card to send its status register */
|
||
CMD16, /* Selects a block length (in bytes) for all following */
|
||
/* block commands (read and write) */
|
||
CMD17, /* Read block of size selected in SET_BLOCKLEN command */
|
||
CMD18, /* Continuously transfers data blocks from card to host */
|
||
/* until interrupted by a Stop command or the requested */
|
||
/* number of data blocks transmitted */
|
||
CMD24, /* Write block of size selected in SET_BLOCKLEN command */
|
||
CMD25, /* Continuously writes blocks of data until ‘Stop Tran’ */
|
||
/* Token or the requested number of blocks received */
|
||
CMD27, /* Programming of the programmable bits of the CSD */
|
||
CMD28, /* If the card has write protection features, this */
|
||
/* command sets the write protection bit of the */
|
||
/* addressed group. The properties of write protection */
|
||
/* are coded in the card specific data (WP_GRP_SIZE). */
|
||
CMD29, /* If the card has write protection features, this */
|
||
/* command clears protection bit of the addressed group */
|
||
CMD30, /* If the card has write protection features, this */
|
||
/* command asks the card to send the status of the write*/
|
||
/* protection bits */
|
||
CMD32, /* Sets the address of first sector of the erase group */
|
||
CMD33, /* Sets the address of the last sector in a continuous */
|
||
/* range within selected erase group, or the address */
|
||
/* of a single sector to be selected for erase */
|
||
CMD34, /* Removes one previously selected sector from the */
|
||
/* erase selection */
|
||
CMD35, /* Sets the address of the first erase group within a */
|
||
/* range to be selected for erase */
|
||
CMD36, /* Sets the address of the last erase group within a */
|
||
/* continuous range to be selected for erase */
|
||
CMD37, /* Removes one previously selected erase group from the */
|
||
/* erase selection. */
|
||
CMD38, /* Erases all previously selected sectors */
|
||
CMD42, /* Used to set/reset the password or lock/unlock the */
|
||
/* card. The size of the Data Block is defined by the */
|
||
/* ET_BLOCK_LEN command */
|
||
CMD55, /* Notifies the card that the next command is an */
|
||
/* application specific command (Non standard command) */
|
||
CMD56, /* Used either to transfer a Data Block to the card or */
|
||
/* to get a Data Block from the card for general */
|
||
/* purpose/application specific commands. The size */
|
||
/* of Data Block is defined with SET_BLOCK_LEN command */
|
||
ACMD6, /* Defines data bus width (’00’=1bit or’10’=4 bits bus) */
|
||
/* (Only for SD) */
|
||
ACMD41, /* Activates card initialization process (Only for SD) */
|
||
CMD_END /* End of commands index */
|
||
} MmcSpiCmdInd_t;
|
||
|
||
typedef enum _MmcAgmType_t
|
||
{
|
||
MmcNoArg = 0,
|
||
MmcBlockLen,
|
||
MmcDataAdd,
|
||
MmcRelAddr,
|
||
MmcOcr
|
||
} MmcAgmType_t;
|
||
|
||
typedef enum _MmcRespType_t
|
||
{
|
||
MmcNoResp = 0,
|
||
MmcR1,
|
||
MmcR1b,
|
||
MmcR2,
|
||
MmcR3
|
||
} MmcRespType_t;
|
||
|
||
typedef struct _MmcCommads_t
|
||
{
|
||
UINT8 TxData;
|
||
MmcAgmType_t Arg;
|
||
MmcRespType_t Resp;
|
||
} MmcCommads_t;
|
||
|
||
typedef union _DataCtrl_t
|
||
{
|
||
UINT32 Data;
|
||
struct
|
||
{
|
||
UINT32 ENABLE : 1;
|
||
UINT32 DIRECTION : 1;
|
||
UINT32 MODE : 1;
|
||
UINT32 DMAENABLE : 1;
|
||
UINT32 BLOCKSIZE : 4;
|
||
UINT32 :24;
|
||
};
|
||
} DataCtrl_t, *pDataCtrl_t;
|
||
|
||
typedef struct _Mmc3FormatCapDescriptor_t
|
||
{
|
||
UINT8 NumberofBlocks[4];
|
||
struct
|
||
{
|
||
UINT8 DescriptorType : 2;
|
||
UINT8 FormatType : 6;
|
||
};
|
||
UINT8 BlockLength[3];
|
||
} Mmc3FormatCapDescriptor_t, *pMmc3FormatCapDescriptor_t;
|
||
|
||
typedef struct _Mmc3FormatCapResponse_t
|
||
{
|
||
UINT8 Reserved0;
|
||
UINT8 Reserved1;
|
||
UINT8 Reserved2;
|
||
UINT8 CapacityListLength;
|
||
Mmc3FormatCapDescriptor_t MaximumDescriptor;
|
||
} Mmc3FormatCapResponse_t, * pMmc3FormatCapResponse_t;
|
||
|
||
typedef enum _SpcPeripheralDeviceType_t
|
||
{
|
||
SbcDirectAccess = 0, SscSequentialAccess,SSCPrinter,SpcProcessor,
|
||
ScbWriteOnce,Mmc2CDROM,Scsi2Scanner,SbcOpticalMemory,
|
||
SmcMediumChanger,Scsi2Communications,DefinedByASCIT8_1,DefinedByASCIT8_2,
|
||
Scc2StorageArrayController,SesEnclosureServices,RbcSimplifiedDirectAccess,
|
||
OcrwOpticalCardReader,BridgingExpanders,OsdObjectBasedStorage, UnknowType = 0x1F,
|
||
} SpcPeripheralDeviceType_t;
|
||
|
||
typedef enum _FormatCapacityDescType_t
|
||
{
|
||
UnformattedMedia = 1, FormattedMedia, NoMediaPresent,
|
||
} FormatCapacityDescType_t;
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Variable declarations.
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function declarations.
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
|
||
extern UINT32 SYS_GetFpclk(UINT32 Periphery);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcPresent
|
||
*
|
||
* checks if a Card is inserted.
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: BOOLEAN - true if Card is inserted, false if not
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
inline BOOLEAN MmcPresent(void);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcWriteProtect
|
||
*
|
||
* checks if inserted Card is write protected.
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: BOOLEAN - true if Card is protected, false if not
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
inline BOOLEAN MmcWriteProtect(void);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcSetClockFreq
|
||
*
|
||
* Sets SPI Clock Frequency
|
||
*
|
||
* Parameters: UINT32 - Frequency
|
||
*
|
||
* Return: UINT32
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
UINT32 MmcSetClockFreq(UINT32 Frequency);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcInit
|
||
*
|
||
* Initialises the MMC Interface and sets it to SPI Mode. Sets Card Present
|
||
* and WriteProtect Pins.
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: void
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
void MmcInit(void);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcPowerDown
|
||
*
|
||
* Sets to PowerDown state
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: void
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
void MmcPowerDown(void);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcSendCmd
|
||
*
|
||
* Implements and sends a Command to MMC
|
||
*
|
||
* Parameters: MmcSpiCmdInd_t ComdInd - specific Command
|
||
* UINT32 Arg - Command Argument
|
||
*
|
||
* Return: MmcState_t - Response from Card
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
MmcState_t MmcSendCmd(MmcSpiCmdInd_t ComdInd, pUINT32 pArg);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcInitMedia
|
||
*
|
||
* Detects and initialises a connected MMC
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: MmcState_t - Response from Card
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
MmcState_t MmcInitMedia(void);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcCsdImplement
|
||
*
|
||
* Implement Data from CSD
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: void
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
void MmcCsdImplemet(void);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcVerify
|
||
*
|
||
* Verifies a MMC
|
||
*
|
||
* Parameters: const UINT8 * pData - Pointer to Data
|
||
* UINT32 Add - Address of Data
|
||
* UINT32 Length - Length of Data
|
||
*
|
||
* Return: MmcState_t - Response from Card
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
inline MmcState_t MmcVerify(const UINT8 * pData, UINT32 Add,
|
||
UINT32 Length);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcGetLastError
|
||
*
|
||
* Returns last occured ERROR
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: UINT32 - Last occured Error
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
UINT32 MmcGetLastError(void);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcStatusUpdate
|
||
*
|
||
* Updates the status of SD/MMC Card
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: void
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
void MmcStatusUpdate(void);
|
||
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcDiskInit
|
||
*
|
||
* Initialises MMC/SD Disk
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: void
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
void MmcDiskInit(void);
|
||
|
||
#ifdef MMC_DISK_INFO
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcDiskInfo
|
||
*
|
||
* Returns Pointer to Info Structure of inserted Disk
|
||
*
|
||
* Parameters: pUINT8 pData - Pointer to Data
|
||
* DiskInfoType_t DiskInfoType - Info Type
|
||
*
|
||
* Return: UINT32
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
UINT32 MmcDiskInfo(pUINT8 pData, DiskInfoType_t DiskInfoType);
|
||
#endif // MMC_DISK_INFO
|
||
/* ---------------------------------------------------------------------------
|
||
* Function: MmcGetDiskCtrlBkl
|
||
*
|
||
* Returns Pointer to Control Block Structure
|
||
*
|
||
* Parameters: void
|
||
*
|
||
* Return: pDiskCtrlBlock_t - Pointer to Control Block
|
||
* ---------------------------------------------------------------------------
|
||
*/
|
||
pDiskCtrlBlk_t MmcGetDiskCtrlBkl(void);
|
||
|
||
|
||
UINT32 SYS_GetFSclk(void);
|
||
|
||
|
||
UINT32 SYS_GetFPclk(UINT32 Periphery);
|
||
|
||
/*************************************************************************
|
||
* Function Name: Dly100us
|
||
* Parameters: void *arg
|
||
* Return: void
|
||
*
|
||
* Description: Delay [100us]
|
||
*
|
||
*************************************************************************/
|
||
void Dly100us(void *arg);
|
||
|
||
|
||
|
||
#endif // __MMC_H
|
||
|
||
|