📄 sd_def.h
字号:
#define BIT_MASK_2 0x03
#define BIT_MASK_3 0x07
#define BIT_MASK_4 0x0F
#define BIT_MASK_5 0x1F
#define BIT_MASK_6 0x3F
#define BIT_MASK_7 0x7F
#define BIT_MASK_8 0xFF
// useful macros
#define SD_IS_BLKDONE (*(volatile kal_uint16*)SDC_DATSTA & SDC_DATSTA_BLKDONE)
#define SD_IS_DATA_CRCERR (*(volatile kal_uint16*)SDC_DATSTA & SDC_DATSTA_DATCRCERR)
#define SD_IS_DATA_TIMEOUT (*(volatile kal_uint16*)SDC_DATSTA & SDC_DATSTA_DATTO)
#define SD_IS_RSP_CRCERR (*(volatile kal_uint16*)SDC_CMDSTA & SDC_CMDSTAA_CMDCRCERR)
#define SD_IS_CMD_TIMEOUT (*(volatile kal_uint16*)SDC_CMDSTA & SDC_CMDSTA_CMDTO)
#define SD_IS_CMD_READY (*(volatile kal_uint16*)SDC_CMDSTA & SDC_CMDSTA_CMDRDY)
#define SD_IS_MMC_IRQ (*(volatile kal_uint16*)SDC_CMDSTA & SDC_CMDSTA_MMCIRQ)
#define SD_IS_CMD_BUSY (*(volatile kal_uint16*)SDC_STA & SDC_STA_CMDBUSY)
#define SD_IS_DAT_BUSY (*(volatile kal_uint16*)SDC_STA & SDC_STA_DATBUSY)
#define SD_IS_SDC_BUSY (*(volatile kal_uint16*)SDC_STA & SDC_STA_SDCBUSY)
#define SD_IS_R1B_BUSY (*(volatile kal_uint16*)SDC_STA & SDC_STA_R1BSY)
#define GET_BIT(byte, bit_pos, bit_mask) (((byte) & ((bit_mask)<<(bit_pos)))>> (bit_pos))
// default values
typedef kal_uint32 SDC_CMD_STATUS;
#define SDC_OCR_DEFAULT 0x00FF8000
#define SDC_OCR_QUERY 0x0
#define TRY_OCR 20
#define SDC_OCR_BUSY 0x80000000
#define SDC_RCA_DEFAULT 0x0000
#define ARG_RCA_MASK 0xffff0000
#define SDC_RCA_MMC 1
#define SDC_DSR_DEFAULT 0x0404
#define SDC_NO_ARG 0
#define SDC_MAX_BKLENGTH 2048
#define SDC_MAX_LOCKBK 34
#define SDC_CMD8_ARG 0x000001AA // the argument of the CMD8
#define SD_ACMD41_HCS 0x40000000 // indicate host support high capacity card.
#define SD_CMD6_RESP_LEN 64 // lenght of the CMD6 response
#define SD_CMD6_QUERY_HIGH_SPEED 0x00FFFFF1 // argument of CMD6 to query the high speed interface
#define SD_CMD6_SELECT_HIGH_SPEED 0x80FFFFF1 // argument of CMD6 to query the high speed interface
#define SD_FUNC_HIGH_SPEED 0x1
#define SD_CSD_VER_20 0x01
#define SD_FLAG_MMC_MRSW_FAIL (0x01) // some special MMC card will fail at multi-read follow a single wirte
#define SD_FLAG_HCS_SUPPORT (0x02) // support block access mode
#define SD_FLAG_CMD6_SUPPORT (0x04) // support CMD6 (SD1.1 higher)
#define SD_FLAG_HS_SUPPORT (0x08) // support high speed interface (SD1.1 higher)
#define SD_FLAG_HS_ENABLED (0x10) // enable high speed interface (SD1.1 higher)
#define SD_FLAG_SD_TYPE_CARD (0x20) // to indicate SD or MMC type card
#define SD_FLAG_USE_USB_CLK (0x40) // to indicate use USB clock
// ERROR definition of SDC_CMD_STATUS
#define NO_ERROR 0
#define ERR_CMD_TIMEOUT 1
#define ERR_APP_CMD_NOT_ACCEPT 2
#define ERR_R3_OCR_BUSY 3
#define ERR_RCA_FAIL 4
#define ERR_INVALID_CARD 5
#define ERR_INVALID_BKLENGTH 6 // over 2048 or not multiple of 4
#define ERR_DAT_CRCERR 7
#define ERR_RW_CMDERR 8
#define ERR_CMD_RSPCRCERR 9
#define ERR_DAT_TIMEOUT 10
#define ERR_STATUS 11
#define ERR_LOCK_UNLOCK_FAILED 12
#define ERR_APPCMD_FAILED 13
#define ERR_NOT_SUPPORT_4BITS 14
#define ERR_NORESP 15
#define ERR_WRITE_PROTECT 16
#define ERR_DATA_NOT_READY 17
#define ERR_CARD_NOT_PRESENT 18
#define ERR_OCR_NOT_SUPPORT 19
#define ERR_DAT_ERROR 20
#define SDIO_4MI_NOT_SUPPORT 21
#define ERR_MMC_BUS_HS_ERROR 22
#define ERR_SendEXTCSD 23
#define ERR_CMD8_INVALID 24
#define ERR_SD_HS_FAIL 25 // SD change high speed interface fail
#define CARD_IS_LOCKED 60
#define ERR_ERRORS 30 // general errors
//enums
typedef enum{
SET_PWD,
CLR_PWD,
LOCK_CARD,
UNLOCK_CARD,
ERASE
}SD_LOCK_OP;
typedef enum{
BIT_1W = 0x0000,
BIT_4W = 0x0002
}SD_BITWIDTH;
typedef enum{
CSD_VER_1_0,
CSD_VER_1_1,
CSD_VER_1_2,
CSD_VER_EXT
}CSD_VER_ENUM;
typedef enum {
IDLE_STA,
READY_STA,
IDENT_STA,
STBY_STA,
TRAN_STA,
DATA_STA,
RCV_STA,
PRG_STA,
DIS_STA,
INV_STA
}T_SDC_STATE;
// MMC40
typedef enum{
CMD_SET,
SET_BIT,
CLR_BIT,
SET_BYTE
}CMD6_ACCESS_MODE;
typedef enum{
BIT_1_MMC40,
BIT_4_MMC40,
BIT_8_MMC40
}BUS_WIDHT_MMC40;
typedef enum{
HS_26M = 1,
HS_52M = 2
}EXT_CSD_CARD_TYPE_MMC40;
typedef enum{
SD_CMD8_RESP_NORESP, // before SD2.0 version or MMC
SD_CMD8_RESP_INVALID, // SD 2.0 or higher compliant but voltage condition is not allow
SD_CMD8_RESP_VALID // SD 2.0 or higher compliant
}SD_CMD8_RESP;
typedef enum{
SD_SPEC_101,
SD_SPEC_110,
SD_SPEC_200
}SD_SPEC;
#define MSDC_SD_BLOCK_SIZE 128 // x4 bytes
#define EXT_CSD_BUS_WIDTH_INDEX 183
#define EXT_CSD_HIGH_SPPED_INDEX 185
#define EXT_CSD_POW_CLASS_INDEX 187
#define EXT_CSD_ENABLE_HIGH_SPEED 1
#define MMC_HIGH_DESITY_CHECK_BIT (0x40000000)
#define MMC_HIGH_DESITY_CHECK_MSK (0x60000000)
// structures
typedef struct {
kal_uint8 rev1[183];
kal_uint8 bus_width;
kal_uint8 rev2;
kal_uint8 high_speed;
kal_uint8 rev3;
kal_uint8 power_class;
kal_uint8 rev4;
kal_uint8 cmd_set_rev;
kal_uint8 rev5;
kal_uint8 cmd_set;
kal_uint8 ext_csd_rev;
kal_uint8 rev7;
kal_uint8 ext_csd_ver;
kal_uint8 rev8;
kal_uint8 card_type;
kal_uint8 rev9[3];
kal_uint8 pwr_52_195;
kal_uint8 pwr_26_195;
kal_uint8 pwr_52_360;
kal_uint8 pwr_26_360;
kal_uint8 rev10[300];
kal_uint8 s_cmd_set;
kal_uint8 rev11[7];
}T_EXT_CSD_MMC40;
/* Card Specific Data(CSD) register structure */
typedef struct {
kal_uint8 tacc; /* read access time-1 */
kal_uint8 nsac; /* read access time-2 */
kal_uint8 tran_speed; /* max. data transfer rate */
kal_uint16 ccc; /* card command classes */
kal_uint32 w_blk_len; /* actual write block length in bytes */
kal_uint32 r_blk_len; /* actual read block length in bytes */
kal_uint32 max_w_blk_len; /* max write data block length */
kal_uint32 max_r_blk_len; /* max read data block length */
kal_uint8 w_blk_misali; /* write block misalighment */
kal_uint8 r_blk_misali; /* read block misalighment */
kal_uint8 w_blk_part; /* partial blocks for write allowed */
kal_uint8 r_blk_part; /* partial blocks for write allowed */
kal_uint32 erase_sec_size_mmc; /* erase sector size */
kal_uint32 erase_grp_size_mmc; /* erase group size */
kal_uint32 wp_grp_size_mmc; /* write protect group size */
kal_uint8 erase_blk_en_sd;
kal_uint32 erase_sec_size_sd;
kal_uint32 wp_prg_size_sd;
kal_uint8 wp_grp_enable; /* write protect group enable */
kal_uint32 capacity; /* capacity in bytes */
kal_uint16 cmd_class; /* card command classes */
kal_uint8 temp_wp; /* temporary write protection */
kal_uint8 perm_wp; /* permanent write protection */
kal_uint8 dsr_imp;
CSD_VER_ENUM csd_ver; /* the version of CSD structure */
kal_uint8 spec_ver; /* defne the MMC system spec. */
T_EXT_CSD_MMC40 *ext_csd; /* pointer to EXT_CSD */
} T_CSD;
typedef struct {
kal_uint8 mid;
kal_uint16 oid;
kal_uint8 pnm[6];
kal_uint8 prv;
kal_uint32 psn;
kal_uint16 year;
kal_uint8 month;
}T_CID;
typedef struct {
kal_uint8 dat_after_erase;
kal_uint8 security;
kal_uint8 bus_width;
SD_SPEC spec_ver;
}T_SCR;
typedef struct{
kal_uint32 max_current : 16;
kal_uint32 group6_info : 16;
kal_uint32 group5_info : 16;
kal_uint32 group4_info : 16;
kal_uint32 group3_info : 16;
kal_uint32 group2_info : 16;
kal_uint32 group1_info : 16;
kal_uint32 group6_result: 4;
kal_uint32 group5_result: 4;
kal_uint32 group4_result: 4;
kal_uint32 group3_result: 4;
kal_uint32 group2_result: 4;
kal_uint32 group1_result: 4;
kal_uint32 ver : 8;
kal_uint32 group6_busy : 16;
kal_uint32 group5_busy : 16;
kal_uint32 group4_busy : 16;
kal_uint32 group3_busy : 16;
kal_uint32 group2_busy : 16;
kal_uint32 group1_busy : 16;
kal_uint8 rev[34];
}T_SWITCH_STATUS;
typedef struct {
kal_uint32 mSDC_ocr; // store the OCR
kal_uint32 mBKLength; // store the block length
kal_uint32 mBKNum; // store the block numbers
kal_uint32 flags; // for some special case handling
T_CSD mCSD; // card specific data
T_CID mCID; // card idendtification
T_SCR mSCR; // only for SD
kal_uint16 mRCA; // store relative card address
T_SDC_STATE mState; // indicate the current state
kal_bool mInactive; // indicate whether card in inactive state
kal_uint8 bus_width; // indicate 4-bits data line enable
kal_bool mWPEnabled; // indicate write protection is enabled(SD)
kal_bool mIsLocked; // indicate whether the card is locked by switch
kal_bool mCD_DAT3; // indicate the pull-up resistor of CD_DAT3 pin
SD_CMD8_RESP mCMD8Resp; // receive response after CMD8 (SD2.0 or higher)
}T_SDC_HANDLE;
extern T_SDC_HANDLE gSD;
void SD_AnalysisCSD(kal_uint32* csd);
void SD_AnalysisCID(kal_uint32* cid);
void SD_AnalysisSCR(kal_uint32* scr);
SDC_CMD_STATUS SD_WaitCmdRdyOrTo(void);
SDC_CMD_STATUS SD_WaitCardNotBusy(void);
SDC_CMD_STATUS SD_WaitDatRdyOrTo(void);
SDC_CMD_STATUS SD_CheckStatus(void);
SDC_CMD_STATUS SD_Send_Cmd(kal_uint32 cmd, kal_uint32 arg);
SDC_CMD_STATUS SD_Reset(void);
SDC_CMD_STATUS SD_Cmd55(kal_uint16 rca);
SDC_CMD_STATUS SD_Cmd56(kal_uint32* buffer, kal_bool IsWrite);
SDC_CMD_STATUS SD_Cmd1_MMC(void);
SDC_CMD_STATUS SD_Acmd41_SD(void);
SDC_CMD_STATUS SD_GetCID(kal_uint32 Cid[4]);
SDC_CMD_STATUS SD_ValidateRCA(kal_uint16* pRca);
SDC_CMD_STATUS SD_SetDSR(void);
SDC_CMD_STATUS SD_SelectCard(kal_uint16 rca);
SDC_CMD_STATUS SD_GetCSD(kal_uint16 rca, kal_uint32 Csd[4]);
SDC_CMD_STATUS SD_GetAddressedCID(kal_uint16 rca, kal_uint32 Cid[4]);
SDC_CMD_STATUS SD_ReadStream_MMC(kal_uint32 address, kal_uint32* rx_buffer, kal_uint32 size);
SDC_CMD_STATUS SD_StopTrans(kal_bool);
SDC_CMD_STATUS SD_GetStatus(kal_uint16 rca, kal_uint32* resp);
SDC_CMD_STATUS SD_GoInactive(kal_uint16 rca);
SDC_CMD_STATUS SD_SetBlength(kal_uint32 BKLength);
SDC_CMD_STATUS SD_ReadSingleBlock(kal_uint32 data_adrs, kal_uint32* rxbuffer);
SDC_CMD_STATUS SD_ReadMultiBlock(kal_uint32 data_adrs, kal_uint32* rxbuffer, kal_uint32 num);
SDC_CMD_STATUS SD_WriteStream_MMC(kal_uint32 address, kal_uint32* txbuffer, kal_uint32 bytes);
SDC_CMD_STATUS SD_WriteSingleBlock(kal_uint32 address, kal_uint32* txbuffer);
SDC_CMD_STATUS SD_WriteMultiBlock(kal_uint32 address, kal_uint32*, kal_uint32);
SDC_CMD_STATUS SD_ProgramCSD(kal_uint32 Csd[4]);
SDC_CMD_STATUS SD_SetWriteProtect(kal_uint32 address);
SDC_CMD_STATUS SD_ClrWriteProtect(kal_uint32 address);
SDC_CMD_STATUS SD_SendWriteProtect(kal_uint32 address, kal_uint32* WPBits32);
SDC_CMD_STATUS SD_EraseCmdClass(kal_uint32 cmd ,kal_uint32 address);
SDC_CMD_STATUS SD_FastIO_MMC(kal_uint16 rca, kal_bool isWrite, kal_uint8 reg_adrs, kal_uint8 data);
SDC_CMD_STATUS SD_GoIRQ_MMC(void);
SDC_CMD_STATUS SD_LockUnlock(SD_LOCK_OP op, char* Oldpwd, char* Newpwd, kal_uint8 Oldlen,kal_uint8 Newlen);
SDC_CMD_STATUS SD_SetBusWidth(SD_BITWIDTH width);
SDC_CMD_STATUS SD_ReadSCR(kal_uint32* scr);
SDC_CMD_STATUS SD_GetSDStatus(kal_uint32* sd_status);
SDC_CMD_STATUS SD_GetNumWrittenBlk(kal_uint32* num);
SDC_CMD_STATUS SD_SetPreEraseBlk(kal_uint32 num);
SDC_CMD_STATUS SD_SetCardDetect(kal_uint8 detect);
void SD_Cmd8(void);
SDC_CMD_STATUS SD_SelectHighSpeed_SD11(void);
SDC_CMD_STATUS SD_Switch_SD11(kal_uint32 arg, T_SWITCH_STATUS* info);
// MMC4.0
SDC_CMD_STATUS SD_Switch_MMC40(kal_uint8 access, kal_uint8 index, kal_uint8 value, kal_uint8 set);
SDC_CMD_STATUS SD_SendEXTCSD_MMC40(kal_uint32* rxbuffer);
// sd.c
SDC_CMD_STATUS SD_Initialize(void);
T_MSDC_CARD SD_CheckSDorMMC(void);
void SD_SetDefault(void);
kal_bool SD_CardDetect(void);
#endif // end of SD_DEF_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -