258 lines
6.9 KiB
C
258 lines
6.9 KiB
C
/*-----------------------------------------------------------------------*/
|
||
/* 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);
|
||
}
|