⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd_def.h

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -