/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2014        */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be        */
/* attached to the FatFs via a glue function rather than modifying it.   */
/* This is an example of glue functions to attach various exsisting      */
/* storage control modules to the FatFs module with a defined API.       */
/*-----------------------------------------------------------------------*/

#include "diskio.h"			
#include "sdio.h"
#include "malloc.h"

#define SD_CARD	 	0  		// SD卡,卷标为0
#define EX_FLASH 	1			// 外部spi flash,卷标为1
#define USB_DISK	3			// U盘,卷标为3

// 对于W25Q128
// 前8M字节给fatfs用,8M字节后,用于存放字库,字库占用6.01M.剩余部分1.99M,给客户自己用	 
#define FLASH_SECTOR_SIZE 	512	
#define FLASH_SECTOR_COUNT 	1024*8*2	// W25Q128,前8M字节给FATFS占用	
#define FLASH_BLOCK_SIZE   	8     		// 每个BLOCK有8个扇区	

FATFS fatfs_sd;              // SD卡逻辑驱动器的工作区
FATFS fatfs_flash;           // FLASH逻辑驱动器的工作区
FATFS fatfs_usb;             // USB逻辑驱动器的工作区

FIL file_sd;                 // SD卡文件对象
FIL file_flash;              // FLASH文件对象
FIL file_usb;                // USB文件对象
//-----------------------------------------------------------------
// DWORD get_fattime (void)
//-----------------------------------------------------------------
// 
// 函数功能: 用户定义函数，为fatfs模块停工当前时间
// 入口参数: 无
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
DWORD get_fattime (void)
{				 
	return 0;
}	


//-----------------------------------------------------------------
// DSTATUS disk_status (BYTE pdrv)
//-----------------------------------------------------------------
// 
// 函数功能: 获得磁盘状态
// 入口参数: BYTE pdrv：用于标识驱动器的物理驱动器号
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
DSTATUS disk_status(BYTE pdrv)
{ 
	return RES_OK;
} 

//-----------------------------------------------------------------
// DSTATUS disk_status (BYTE pdrv)
//-----------------------------------------------------------------
// 
// 函数功能: 初始化磁盘
// 入口参数: BYTE pdrv：用于标识驱动器的物理驱动器号
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
DSTATUS disk_initialize(BYTE pdrv)
{
	u8 res=0;	    
	switch(pdrv)
	{
		case SD_CARD:			// SD卡
			res=SD_Init();	// SD卡初始化 
  		break;
		case USB_DISK:		// U盘  
			break;
		default:
			res=1; 
	}		 
	if(res)
		return  STA_NOINIT;
	else 
		return 0; 				// 初始化成功 
} 

//-----------------------------------------------------------------
// DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)
//-----------------------------------------------------------------
// 
// 函数功能: 读扇区
// 入口参数: BYTE pdrv：磁盘编号0~9
//					 BYTE *buff：数据接收缓冲首地址
//					 DWORD sector：扇区地址
//					 UINT count：需要读取的扇区数
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)
{
	u8 res=0; 
  if (!count)
		return RES_PARERR;// count不能等于0，否则返回参数错误		 	 
	switch(pdrv)
	{
		case SD_CARD:			// SD卡
			res=SD_ReadDisk(buff,sector,count);	 
			while(res)			// 读出错
			{
				SD_Init();		// 重新初始化SD卡
				res=SD_ReadDisk(buff,sector,count);	
			}
			break;
		case USB_DISK:		// U盘    
									    
			break;
		default:
			res=1; 
	}
   // 处理返回值，将SPI_SD_driver.c的返回值转成ff.c的返回值
    if(res==0x00)
			return RES_OK;	 
    else 
			return RES_ERROR;	   
}

//-----------------------------------------------------------------
// DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)
//-----------------------------------------------------------------
// 
// 函数功能: 写扇区
// 入口参数: BYTE pdrv：磁盘编号0~9
//					 BYTE *buff：发送数据首地址
//					 DWORD sector：扇区地址
//					 UINT count：需要写入的扇区数 
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)
{
	u8 res=0;  
  if (!count)
		return RES_PARERR;// count不能等于0，否则返回参数错误		 	 
	switch(pdrv)
	{
		case SD_CARD:	// SD卡
			res=SD_WriteDisk((u8*)buff,sector,count);
			while(res)	// 写出错
			{
				SD_Init();	//重新初始化SD卡
				res=SD_WriteDisk((u8*)buff,sector,count);	
				//printf("sd wr error:%d\r\n",res);
			}
			break;
		case USB_DISK:	// U盘 
			
			break;
		default:
			res=1; 
	}
    // 处理返回值，将SPI_SD_driver.c的返回值转成ff.c的返回值
    if(res == 0x00)
			return RES_OK;	 
    else 
			return RES_ERROR;	
} 

//-----------------------------------------------------------------
// DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)
//-----------------------------------------------------------------
// 
// 函数功能: 其他表参数的获得
// 入口参数: BYTE pdrv：磁盘编号0~9
//					 BYTE cmd：控制代码
//					 void *buff：发送/接收缓冲区指针 
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)
{
	DRESULT res;						  			     
	if(pdrv==SD_CARD)// SD卡
	{
		switch(cmd)
		{
			case CTRL_SYNC:
					res = RES_OK; 
					break;	 
			case GET_SECTOR_SIZE:
					*(DWORD*)buff = 512; 
					res = RES_OK;
					break;	 
			case GET_BLOCK_SIZE:
					*(WORD*)buff = SDCardInfo.CardBlockSize;
					res = RES_OK;
					break;	 
			case GET_SECTOR_COUNT:
					*(DWORD*)buff = SDCardInfo.CardCapacity/512;
					res = RES_OK;
					break;
			default:
					res = RES_PARERR;
					break;
		}
	}
	else if(pdrv==USB_DISK)	// U盘
	{
		
	}
	else 
		res=RES_ERROR;// 其他的不支持
	
  return res;
} 
void *ff_memalloc (UINT size)			
{
	return (void*)mymalloc(SRAMEX,size);
}
//释放内存
void ff_memfree (void* mf)		 
{
	myfree(SRAMEX,mf);
}

//-----------------------------------------------------------------
// End Of File
//----------------------------------------------------------------- 
