www.pudn.com > sd_drv.rar > sd_interface.c


 
#include "spi_sd.h" 
 
#define SECTOR_SIZE         512  
#define SD_NO_ERR           0 
 
 
static  BYTE   mIsInitialized = 0; 
 
extern const   BYTE        SD_CS_PIN ; 
extern const   BYTE        SD_DO_PIN ; 
extern const   BYTE        SD_CLK_PIN; 
extern const   BYTE        SD_DIN_PIN; 
/************************************/ 
 
 
 
 
static void SPI_init(void) 
{ 
	 
	 GPIO_ModeSetup(SD_CLK_PIN,0); 
	 GPIO_InitIO(1, SD_CLK_PIN); 
	 GPIO_WriteIO(0,SD_CLK_PIN); 
	 GPIO_ModeSetup(SD_CS_PIN,0); 
	 GPIO_InitIO(1, SD_CS_PIN); 
	 GPIO_WriteIO(0,SD_CS_PIN); 
	 GPIO_ModeSetup(SD_DIN_PIN,0); 
	 GPIO_InitIO(1, SD_DIN_PIN); 
	 GPIO_WriteIO(0,SD_DIN_PIN); 
	 GPIO_ModeSetup(SD_DO_PIN,0); 
	 GPIO_InitIO(0, SD_DO_PIN); 
	 GPIO_WriteIO(0,SD_DO_PIN);	 	 	 	 
} 
 
static int  SPI_MountDevice(void * DriveData, int DeviceNumber, int DeviceType, DWORD Flags) 
{	 
    mIsInitialized = 0; 
    SPI_init(); 
    if(SPI_SD_Initialize() == 0) 
    { 
      mIsInitialized = 1;      	 
	  	return SECTOR_SIZE; 
    } 
	return FS_MSDC_MOUNT_ERROR; 
	 
} 
static int  SPI_ShutDown(void * DriveData) 
{ 
   return FS_NO_ERROR; 
} 
static int  SPI_ReadSectors(void * DriveData, DWORD Sector, UINT Sectors, void * Buffer) 
{ 
	 
	kal_uint8 status = SPI_SD_Read(Sector, Sectors,Buffer); 
	 
	if(status != SD_NO_ERR ) 
	{	 
   	return FS_MSDC_READ_SECTOR_ERROR; 
	} 
   return FS_NO_ERROR; 
} 
 
 
static int  SPI_WriteSectors(void * DriveData, DWORD Sector, UINT Sectors, void * Buffer) 
{ 
  kal_uint8 status = SPI_SD_Write(Sector, Sectors,Buffer); 
	 
	if(status != SD_NO_ERR) 
	{ 
		return FS_MSDC_WRITE_SECTOR_ERROR; 
	} 
   return FS_NO_ERROR; 
} 
static int  SPI_DiscardSectors(void * DriveData, DWORD Sector, UINT Sectors) 
{ 
   return FS_NO_ERROR; 
} 
static int  SPI_GetDiskGeometry(void * DriveData, FS_PartitionRecord * DiskGeometry, BYTE * MediaDescriptor) 
{ 
   memset((void*)DiskGeometry, 0, sizeof * DiskGeometry); 
 
   DiskGeometry->Sectors = SPI_SD_BlockNum(); 
 
	*MediaDescriptor = 0xF8; 
 
   return FS_NO_ERROR; 
} 
 
static  int  SPI_MediaChanged(void * DriveData) 
{	 
		if(mIsInitialized) 
		{ 
   		return FS_NO_ERROR; 
		} 
		else 
		{ 
			return FS_MSDC_PRESNET_NOT_READY; 
		} 
 
	return FS_MSDC_NOT_PRESENT; 
} 
 
 
static int SPI_MSDC_GetCardStatus(void * DriveData, int AckType) 
{ 
   return 0; 
} 
 
FS_Driver SPI_FS_SdDrv = { 
   SPI_MountDevice, 
   SPI_ShutDown, 
   SPI_ReadSectors, 
   SPI_WriteSectors, 
   SPI_MediaChanged, 
   SPI_DiscardSectors, 
   SPI_GetDiskGeometry, 
   0, 
   0, 
   0, 
   0, 
   0, 
   0, 
   SPI_MSDC_GetCardStatus    
};