#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
};