⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disk.c

📁 最新的LPC214X FATFS驱动程序
💻 C
字号:
////  $Id: disk.c 42 2008-10-04 18:40:36Z jcw $//  $Revision: 42 $//  $Author: jcw $//  $Date: 2008-10-04 14:40:36 -0400 (Sat, 04 Oct 2008) $//  $HeadURL: http://tinymicros.com/svn_public/arm/lpc2148_demo/trunk/fatfs/disk.c $//#include <stdio.h> #include "../mmc/mmc.h"#include "disk.h"#define S_MAX_SIZ 512static volatile DSTATUS gDiskStatus = DSTATUS_NOINIT; static mediaStatus_t mediaStatus;//////DSTATUS diskInitialize (U8 drv __attribute__ ((unused))){  //  //  Media Init  //  switch (mmcInitMedia ())  {    case MmcOk :      {        mediaStatus.statusCode = DSC_COMMANDPASS;        mediaStatus.mediaChanged = TRUE;        gDiskStatus = 0;        if (mmcWriteProtect ())        {          mediaStatus.writeProtect = TRUE;          gDiskStatus |= DSTATUS_PROTECT;        }      }      break;    case MmcCardError :    case MmcDataError :      {        mediaStatus.statusCode = DSC_NOTREADY;        gDiskStatus = DSTATUS_NOINIT;        if (mmcWriteProtect ())        {          mediaStatus.writeProtect = TRUE;          gDiskStatus |= DSTATUS_PROTECT;        }      }      break;    default:      {        mediaStatus.statusCode = DSC_NOTPRESENT;        gDiskStatus = DSTATUS_NODISK;      }      break;  }  return gDiskStatus;}//////DSTATUS diskShutdown (void){  gDiskStatus |= DSTATUS_NOINIT;  return gDiskStatus;}//////DSTATUS diskStatus (U8 drv __attribute__ ((unused))){  return gDiskStatus;}//////DRESULT diskRead (U8 disk __attribute__ ((unused)), U8 *buff, U32 sector, U8 count){  U32 res;  if (gDiskStatus & DSTATUS_NOINIT)     return DRESULT_NOTRDY;  if (!count)     return DRESULT_PARERR;  res = mmcRead (buff, sector, count);  if (res == MMC_OK)    return DRESULT_OK;  else    return DRESULT_ERROR; }//////#if _FS_READONLY == 0DRESULT diskWrite (U8 disk __attribute__ ((unused)), const U8 *buff, U32 sector, U8 count){  U32 res;  if (gDiskStatus & DSTATUS_NOINIT)     return DRESULT_NOTRDY;  if (gDiskStatus & DSTATUS_PROTECT)     return DRESULT_WRPRT;  if (!count)     return DRESULT_PARERR;  res = mmcWrite (buff, sector, count);  if (res == MMC_OK)    return DRESULT_OK;  else    return DRESULT_ERROR; }#endif//////DRESULT diskIoctl (U8 drv, U8 ctrl, void *buff){  DRESULT res;  U8 n;  U8 csd [16];  U16 csize;  if (drv)     return DRESULT_PARERR;  if (gDiskStatus & DSTATUS_NOINIT)     return DRESULT_NOTRDY;  res = DRESULT_ERROR;  switch (ctrl)   {    case IOCTL_GET_SECTOR_COUNT :      {         if (mmcReadCardInfo (csd, CMD9) == MmcOk)                        {          //          //  SDC ver 2.00          //          if ((csd [0] >> 6) == 1)           {             csize = csd [9] + ((U16)csd [8] << 8) + 1;            *(U32 *) buff = (U32) csize << 10;          }           //          //  MMC or SDC ver 1.XX          //          else           {                        n = (csd [5] & 15) + ((csd [10] & 128) >> 7) + ((csd [9] & 3) << 1) + 2;            csize = (csd [8] >> 6) + ((U16) csd [7] << 2) + ((U16) (csd [6] & 3) << 10) + 1;            *(U32 *) buff = (U32) csize << (n - 9);          }          res = DRESULT_OK;        }      }      break;    case IOCTL_GET_SECTOR_SIZE :      {#if S_MAX_SIZ > 512        if (mmcDskStatus.blockSize)          *(U16 *) buff = mmcDskStatus.blockSize;        else        {          DBG ("mmcDskStatus.blockSize not set!\n");          *(U16 *) buff = S_MAX_SIZ;        }#else        *(U16 *) buff = S_MAX_SIZ;#endif        res = DRESULT_OK;      }      break;    case IOCTL_CTRL_SYNC :      {        if (mmcWaitReady ())          res = DRESULT_OK;      }      break;    case IOCTL_MMC_GET_CSD :      {        if (mmcReadCardInfo (buff, CMD9) == MmcOk)          res = DRESULT_OK;      }      break;    case IOCTL_MMC_GET_CID :      {        if (mmcReadCardInfo (buff, CMD10) == MmcOk)          res = DRESULT_OK;      }      break;# if 0    case IOCTL_CTRL_POWER:    case IOCTL_CTRL_LOCK:    case IOCTL_CTRL_EJECT:    case IOCTL_MMC_GET_OCR:     /* Receive OCR as an R3 resp (4 bytes) */    case IOCTL_ATA_GET_REV:    case IOCTL_ATA_GET_MODEL:    case IOCTL_ATA_GET_SN:#endif                            default:      res = DRESULT_PARERR;  }  return res;}//////BOOL diskPresent (void){  return mmcCardPresent ();}//////const char *diskErrorText (DRESULT d){  unsigned int i;  typedef struct errorStrings_s  {    DRESULT dresult;    const char *string;  }  errorStrings_t;  static const errorStrings_t errorStrings [] =  {    { DRESULT_OK,       "OK"           },    { DRESULT_ERROR,    "R/W ERROR"    },    { DRESULT_WRPRT,    "WP ERROR"     },    { DRESULT_NOTRDY,   "NOT READY"    },    { DRESULT_PARERR,   "INVALID PARM" },  };  for (i = 0; i < arrsizeof (errorStrings); i++)    if (errorStrings [i].dresult == d)      return errorStrings [d].string;  return "(no err text)";}void diskErrorTextPrint (DRESULT d){  printf ("rrc=%u %s\n", d, diskErrorText (d));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -