258 lines
6.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2013 */
/*-----------------------------------------------------------------------*/
/* 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 module to the FatFs module with a defined API. */
/*-----------------------------------------------------------------------*/
#include "diskio.h" /* FatFs lower layer API */
#include "tfcard_sdio.h"
#include "w25qxx.h"
#include "malloc.h"
#include "usbhost_user.h"
//////////////////////////////////////////////////////////////////////////////////
#define SD_CARD 0 //SD卡,卷标为0
#define EX_FLASH 1 //外部flash,卷标为1
#define USB_DISK 2 //U盘,卷标为2
#define FLASH_SECTOR_SIZE 512
u16 FLASH_SECTOR_COUNT=2048*10; //W25Q1218,前10M字节给FATFS占用
#define FLASH_BLOCK_SIZE 8 //每个BLOCK有8个扇区
//初始化磁盘
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber (0..) */
)
{
u8 res=0;
switch(pdrv)
{
case SD_CARD://SD卡
res = SD_Init();
break;
case EX_FLASH://外部FLASH
W25QXX_Init();
FLASH_SECTOR_COUNT=2048*10; //W25Q1218,前10M字节给FATFS用
case USB_DISK://U盘
if(USBH_UDISK_Status())return 0; //U盘连接成功,则返回1.否则返回0
else return 1;
default:
res=1;
}
if(res)return STA_NOINIT;
else return 0; //初始化成功
}
//获得磁盘状态
DSTATUS disk_status (
BYTE pdrv /* Physical drive nmuber (0..) */
)
{
return 0;
}
/****************************************************************************
* 名 称: DRESULT disk_read ()
* 功 能:读扇区
* 入口参数drv:磁盘编号0~9
buff:数据接收缓冲首地址
sector:扇区地址
count:需要读取的扇区数
* 返回参数:
* 说 明移植文件系统要调用SD卡和W25Qxx的读扇区函数
****************************************************************************/
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address (LBA) */
UINT count /* Number of sectors to read (1..128) */
)
{
u8 res=0;
if (!count)return RES_PARERR;
switch(pdrv)
{
case SD_CARD: //SD卡
res=SD_ReadSDisk(buff,sector,count);
break;
case EX_FLASH: //外部FLASH
for(;count>0;count--)
{
W25QXX_Read(buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
sector++;
buff+=FLASH_SECTOR_SIZE;
}
res=0;
break;
case USB_DISK://U盘
res=USBH_UDISK_Read(buff,sector,count);
break;
default:
res=1;
}
if(res==0x00)return RES_OK;
else return RES_ERROR;
}
/****************************************************************************
* 名 称: DRESULT disk_write ()
* 功 能:写扇区
* 入口参数drv:磁盘编号0~9
buff:数据接收缓冲首地址
sector:扇区地址
count:需要写入的扇区数
* 返回参数:
* 说 明移植文件系统要调用SD卡和W25Qxx的写扇区函数
****************************************************************************/
#if _USE_WRITE
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber (0..) */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Sector address (LBA) */
UINT count /* Number of sectors to write (1..128) */
)
{
u8 res=0;
if (!count)return RES_PARERR;
switch(pdrv)
{
case SD_CARD://SD卡
res=SD_WriteSDisk((u8*)buff,sector,count);
break;
case EX_FLASH://外部FLASH
for(;count>0;count--)
{
W25QXX_SectorWrite((u8*)buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
sector++;
buff+=FLASH_SECTOR_SIZE;
}
res=0;
break;
case USB_DISK://U盘
res=USBH_UDISK_Write((u8*)buff,sector,count);
break;
default:
res=1;
}
if(res == 0x00)return RES_OK;
else return RES_ERROR;
}
#endif
/****************************************************************************
* 名 称: DRESULT disk_ioctl ()
* 功 能:其他表参数的获得
* 入口参数drv:磁盘编号0~9
ctrl:控制代码
buff:发送/接收缓冲区指针
* 返回参数:
* 说 明:
****************************************************************************/
#if _USE_IOCTL
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
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==EX_FLASH) //外部FLASH
{
switch(cmd)
{
case CTRL_SYNC:
res = RES_OK;
break;
case GET_SECTOR_SIZE:
*(WORD*)buff = FLASH_SECTOR_SIZE;
res = RES_OK;
break;
case GET_BLOCK_SIZE:
*(WORD*)buff = FLASH_BLOCK_SIZE;
res = RES_OK;
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff = FLASH_SECTOR_COUNT;
res = RES_OK;
break;
default:
res = RES_PARERR;
break;
}
}
else if(pdrv==USB_DISK) //U盘
{
switch(cmd)
{
case CTRL_SYNC:
res = RES_OK;
break;
case GET_SECTOR_SIZE:
*(WORD*)buff=512;
res = RES_OK;
break;
case GET_BLOCK_SIZE:
*(WORD*)buff=512;
res = RES_OK;
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff=USBH_MSC_Param.MSCapacity;
res = RES_OK;
break;
default:
res = RES_PARERR;
break;
}
}
else res=RES_ERROR;//其他的不支持
return res;
}
#endif
//获得时间
//User defined function to give a current time to fatfs module */
//31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */
//15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */
DWORD get_fattime (void)
{
return 0;
}
//动态分配内存
void *ff_memalloc (UINT size)
{
return (void*)Mem_malloc(INSRAM,size);
}
//释放内存
void ff_memfree (void* mf)
{
Mem_free(INSRAM,mf);
}