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

📄 sd.c

📁 sd card for pxa270 (在bootloader 下)
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<windows.h>
#include <ethdbg.h> 
#include "halether.h" 
#include <nkintr.h>
#include <pehdr.h>
//#include "xllp_defs.h"
#include "xllp_mmc.h"
//#include "xllp_pwm.h"
#include <oal_memory.h>
#include "sd.h"
#include <math.h>
#include "fat.h"


//UINT32 databuf[512/4];
typedef struct
{
	UINT CMD;
	UINT ADDR;
	UINT FSIZE;
	UINT BSIZE;
	UINT RATE;
	UINT NOB;          //block number
	UINT DATATRANS;
	BOOL BUSY;
	BOOL READSCR;
	
}mmcStack;


#define SO_SCR 			0x8;  // size of sd scr register
#define SO_BLOCK 		0x200;
#define RCA_MMC_CARD 	0x420000;
#define CMD1_ADDR 		0x200000;

typedef struct{
	UINT32 lresponse[4];
	UINT32 sresponse;
	UINT32 status;
}STATRES;

typedef struct {
	UINT SZ_PROC : 32;
	UINT SD_CARD_TYPE : 16;
	UINT RES2 : 13;
	UINT SECD_MODE : 1;
	UINT DAT_BUS_WIDTH : 2;
} STATUS;

typedef struct {
	UINT SCR_STRUCTURE : 4;
	UINT SD_SPEC : 4;
	UINT DATA_STAT_AFTER_ERASE : 1;
	UINT SD_SECURITY : 3;
	UINT SD_BUS_WIDTH : 4;
	UINT RES2 : 16;
	UINT RES1 : 32;	// RESERVED FOR MANUFACTURER
}SCR;//SCR scr;

typedef struct {
	UINT NU : 1;	// 0- 31
	UINT CRC : 7;
	UINT MDT : 8;
	UINT PSN : 16;
	
	UINT PSNx : 16;	 // 32- 63
	UINT PRV : 8;
	UINT PNM : 8;
	
	UINT PNMx :32;	  // 64- 96
	
	UINT PNMxx : 7;	  //96 - 127
	UINT OID : 16;
	UINT MID : 8;
}MMCCID; 


typedef struct {
	UINT ECC : 2;               // Bits 0-31
	UINT RES1 : 2;
	UINT TMP_WRITE_PROTECT : 1;
	UINT PERM_WRITE_PROTECT : 1;
	UINT COPY : 1;
	UINT RES2 : 1;
	UINT RES3 : 5;
	UINT WRITE_BL_PARTIAL : 1;
	UINT WRITE_BL_LEN : 4;
	UINT R2W_FACTOR : 3;
	UINT DEFAULT_ECC : 2;
	UINT WP_GRP_ENABLE : 1;
	UINT WP_GRP_SIZE : 5;
	UINT ERASE_GRP_MULT : 3;
	
	UINT ERASE_GRP_MULTx : 2;   // Bits 32-63
	UINT ERASE_GRP_SIZE : 5;
	UINT C_SIZE_MULT : 3;
	UINT VDD_W_CURR_MAX : 3;
	UINT VDD_W_CURR_MIN : 3;
	UINT VDD_R_CURR_MAX : 3;
	UINT VDD_R_CURR_MIN : 3;
	UINT C_SIZE : 10;
	
	UINT C_SIZEx : 2;           // Bits 64-95
	UINT RES4 : 2;
	UINT DSR_IMP : 1;
	UINT READ_BLK_MISALIGN : 1;
	UINT WRITE_BLK_MISALIGN : 1;
	UINT READ_BL_PARTIAL : 1;
	UINT READ_BL_LEN : 4;
	UINT CCC : 12;
	UINT TRAN_SPEED : 8;
	
	UINT NSAC : 8;              // Bits 96-127
	UINT TAAC : 8;
	UINT RES5 : 2;
	UINT SPEC_VERS : 4;
	UINT CSD_STRUCTURE : 2;
	UINT RES6 : 8;
}MMCCSD;

union {
    UINT8 b[16];
    UINT16 db[8];
	UINT32 qb[4];
	MMCCSD mmc_csd;
}XsMMC_CSD;

typedef	struct{
	UINT32 block;
	UINT32 *buffer;
	UINT size;
	BOOL mmc;
	UINT32 OCR;
	UINT32 rca;
	MMCCSD *mmc_csd;
	MMCCID *mmc_cid;
	SCR *sd_scr;
	STATUS sd_status;
}MMCSDAttribT;


#define MMCSD_CARD_STATUS_OOR		(1u<<31)	// out of range
#define MMCSD_CARD_STATUS_AE		(1u<<30)	// address error 
#define MMCSD_CARD_STATUS_EP		(1u<<27)	// erase param
#define MMCSD_CARD_STATUS_WPV		(1u<<26)	// write protected block
#define MMCSD_CARD_STATUS_CL		(1u<<25)	// card locked
#define MMCSD_CARD_STATUS_ERR		(1u<<19) 	// general error
#define MMCSD_CARD_STATUS_CS		(0xfu<<9)  	// current state
#define MMCSD_CARD_STATUS_RFD		(1u<<8)  	// ready for data
#define MMCSD_CARD_STATUS_AC		(1u<<5)	 	//  app command
#define MMCSD_CARD_OCR_nBUSY		(1u<<31)	//  app command


typedef enum
{
	DNONE=0,
		WRITE,
		READ
}dataDirection;

typedef struct {
	
	
	UINT NU						: 1;
	UINT CRC 					: 7;
	UINT RES1 					: 2;  
	UINT FILE_FORMAT 			: 2;
	UINT TMP_WRITE_PROTECT 		: 1;
	UINT PERM_WRITE_PROTECT 	: 1;
	UINT COPY 					: 1;
	UINT FILE_FORMAT_GRP 		: 1;
	UINT RES2 					: 5;
	UINT WRITE_BL_PARTIAL 		: 1;
	UINT WRITE_BL_LEN 			: 4;
	UINT R2W_FACTOR 			: 3;
	UINT RES3 					: 2;
	UINT WP_GRP_ENABLE 			: 1;	   // Bits 31-0
	
	UINT WP_GRP_SIZE 			: 7;	 
	UINT SECTOR_SIZE 			: 7;
	UINT ERASE_BLK_EN 			: 1;   
	UINT C_SIZE_MULT 			: 3;
	UINT VDD_W_CURR_MAX 		: 3;
	UINT VDD_W_CURR_MIN 		: 3;
	UINT VDD_R_CURR_MAX 		: 3;
	UINT VDD_R_CURR_MIN 		: 3;
	UINT C_SIZE 				: 2;      // Bits 63-32
	
	UINT C_SIZEx 				: 10;		   
	UINT RES4 					: 2;
	UINT DSR_IMP 				: 1;
	UINT READ_BLK_MISALIGN 		: 1;
	UINT WRITE_BLK_MISALIGN 	: 1;
	UINT READ_BL_PARTIAL 		: 1;
	UINT READ_BL_LEN 			: 4;
	UINT CCC 					: 12;
	UINT TRAN_SPEED 			: 8;	// Bits 64-95   
	
	UINT NSAC 					: 8;              
	UINT TAAC 					: 8;
	UINT RES5 					: 6;
	UINT CSD_STRUCTURE 			: 2;
    
	
	
}SDCSD;



union {
    UINT8 b[16];
    UINT16 db[8];
	UINT32 qb[4];
	SDCSD sd_csd;
}XsSD_CSD;

typedef struct {
	UINT NU : 1;	// 0- 31
	UINT CRC : 7;
	UINT MDT : 12;
	UINT RES1 : 4;
	UINT PSN : 8;
	
	UINT PSNx : 24;	 // 32- 63
	UINT PRV : 8;
	
	UINT PNM : 32;  // 64-96
	
	UINT PNMx : 8;	  //96 - 127
	UINT OID : 16;
	UINT MID : 8;
}SDCID;

union {
    UINT8 b[16];
    UINT16 db[8];
	UINT32 qb[4];
    SDCID sd_cid;
} XsSD_CID;


 BULVERDE_GPIO_REG *v_pGPIOReg=NULL;
 XLLP_MMC_T  *v_pMMCReg=NULL;
 P_XLLP_CLKMGR_T   v_pCLKReg=NULL;
static UINT16 rxRead, txWritten;
static UINT32 *putBuf, *getBuf;

UINT   GetSpeed(UINT TRAN_SPEED)
{
	double speed,time;
	switch((TRAN_SPEED>>3)&0xF)
	{
		case 0x1:
			time = 1;
			break;
		case 0x2:
			time = 1.2;
			break;
		case 0x3:
			time = 1.3;
			break;
		case 0x4:
			time = 1.5;
			break;
		case 0x5:
			time = 2.0;
			break;
		case 0x6:
			time = 2.5;
			break;
		case 0x7:
			time = 3.0;
			break;
		case 0x8:
			time = 3.5;
			break;
		case 0x9:
			time = 4.0;
			break;
		case 0xA:
			time = 4.5;
			break;
		case 0xB:
			time = 5.0;
			break;
		case 0xC:
			time = 5.5;
			break;
		case 0xD:
			time = 6.0;
			break;
		case 0xE:
			time = 7.0;
			break;
		case 0xF:
			time = 8.0;
			break;
	}
	switch(TRAN_SPEED & 0x7)
	{
	case 0x0:
		speed = 1;
		break;
	case 0x1:
		speed = 10;
		break;
	case 0x2:
		speed = 100;
		 break;
	case 0x3:
		speed = 1000;
		break;
	default:
		speed = 0;
	}
	return (UINT)(speed/time/10);


}
static void pc5000_init_sd()
{
	v_pGPIOReg = (XLLP_GPIO_T *) OALPAtoVA(BULVERDE_BASE_REG_PA_GPIO, FALSE);
	v_pMMCReg  = (XLLP_MMC_T *) OALPAtoVA(BULVERDE_BASE_REG_PA_MMC, FALSE);
	v_pCLKReg  = (P_XLLP_CLKMGR_T ) OALPAtoVA(BULVERDE_BASE_REG_PA_CLKMGR, FALSE);
	
}	
static UINT32 parseResponse( UINT16 * response, BOOL wrap)
{
	UINT32 tempResponse=0;
	if(wrap)  
		tempResponse  =  ((((UINT32)response[2] & 0xff)<< 24) | 
		((UINT32)response[1] << 8) | (response[0] & 0xff00) >> 8 );
	else
		tempResponse  =  ((((UINT32)response[1] & 0xff)<< 24) | 
		((UINT32)response[0] << 8) | (response[2] & 0xff00) >> 8 );		
	
	
	return(tempResponse);
}

static UINT32 checkStatus(P_XLLP_MMC_T mmcReg, UINT32 response)
{
	UINT32 StatusReceived=0;	 
	
	StatusReceived |= ( (response & MMCSD_CARD_STATUS_CS)<<19);
	
	if(mmcReg->MMC_STAT & XLLP_STAT_TORD)
		StatusReceived |= MMCSD_STAT_TOR;
	  	
	if(mmcReg->MMC_STAT & XLLP_STAT_TORSPNS)
		StatusReceived |= MMCSD_STAT_TORSPN;
	
	if(mmcReg->MMC_STAT & XLLP_STAT_CRCWRERR)
		StatusReceived |= MMCSD_STAT_CRCWRER;
	  	
	if(mmcReg->MMC_STAT & XLLP_STAT_CRCRDERR)
		StatusReceived |= MMCSD_STAT_CRCRDERR;
	
	if(mmcReg->MMC_STAT & XLLP_STAT_DATAERRTKN)
		StatusReceived |= MMCSD_STAT_DATAERRTKN;
	  	
	if(mmcReg->MMC_STAT & XLLP_STAT_FLASHERR)
		StatusReceived |= MMCSD_STAT_FLASHERR;
	
	if(response & MMCSD_CARD_STATUS_OOR)
		StatusReceived |= MMCSD_STAT_OUT_OF_RANGE;
	
	if(response & MMCSD_CARD_STATUS_AE)
		StatusReceived |= MMCSD_STAT_ADDRESS_ERR;
	
	if(response & MMCSD_CARD_STATUS_EP )
		StatusReceived |= MMCSD_STAT_ERASE_PARAM;
	  	
	if(response & MMCSD_CARD_STATUS_WPV)
		StatusReceived |= MMCSD_CARD_STATUS_WPV;
	
	if(response & MMCSD_CARD_STATUS_CL)
		StatusReceived |= MMCSD_STAT_CARD_LOCKED;
	  	
	if(response & MMCSD_CARD_STATUS_ERR)
		StatusReceived |= MMCSD_STAT_ADDRESS_ERR;
	return(StatusReceived);	  	
	 	  	
	
}
static void pc5000_init_sd_hardware()
{
	if((v_pGPIOReg==NULL)||(v_pMMCReg==NULL)||(v_pCLKReg==NULL))
		pc5000_init_sd();
	XllpMmcSdHWInit(v_pGPIOReg,v_pCLKReg);//init hardware
	msWait(100);//wait
	//XllpMmcSetUpClock(v_pMMCReg,XLLP_MMC_304KHz, 0);
	XllpMmcSetUpClock(v_pMMCReg,XLLP_MMC_19_5MHz, 0);
    v_pMMCReg->MMC_STRPCL=XLLP_STRPCL_STRTCLK;
}






static STATRES mmcProcessCmd(P_XLLP_MMC_T mmcReg,  mmcStack *MMC)
{
	STATRES statusRes;
	UINT16  res[8];
//	UINT32 *pBuf = databuf;
//	BYTE *psBuf =(BYTE*)databuf;

	XllpMmcSdInts(mmcReg,XLLP_MMC_I_MASK_ENDCMDRES); //bit2
	if (MMC->DATATRANS)    //read or write
	{
		// XllpMmcSdSetupCmd(mmcReg, MMC->CMD, MMC->ADDR, 64,0); 
		goto ExpectedDataTrans;
	}
	else                 //dnone
	{
		XllpMmcSdSetupCmd(mmcReg, MMC->CMD, MMC->ADDR, 64,0);
		//EdbgOutputDebugString("while (!(mmcReg->MMC_STAT & XLLP_STAT_ENDCMDRES))\r\n");
		while (!(mmcReg->MMC_STAT & XLLP_STAT_ENDCMDRES));      //wait intrupt ENDCMDRES
		//EdbgOutputDebugString("while (!(mmcReg->MMC_STAT & XLLP_STAT_ENDCMDRES))\r\n");	
		if(mmcReg->MMC_CMDAT & XLLP_MMC_CMDAT_RESTYPE)    //mmc and spi R3 format        
			goto ExtractResponse;
		else
			goto end;
	}
	
ExpectedDataTrans:
//	EdbgOutputDebugString("ExpectedDataTrans\r\n");
	
	XllpMmcSdSetupXCmd(mmcReg, MMC->FSIZE, MMC->BSIZE , 0xffff);//set NUMBLK=FSIZE/BSIZE and BLKLEN
	XllpMmcSdSetupCmd(mmcReg, MMC->CMD, MMC->ADDR, 64,0); 
//	EdbgOutputDebugString("XllpMmcSdSetupCmd(mmcReg, MMC->CMD, MMC->ADDR, 64,0)\r\n");
	if (MMC->DATATRANS == WRITE)
	{
		XllpMmcSdInts(mmcReg, XLLP_MMC_I_MASK_TXFIFOWRREQ);
	}
	else
	{
		XllpMmcSdInts(mmcReg, XLLP_MMC_I_MASK_RXFIFORDREQ);//set rxfifo int
		
		
	}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -