10 #if GFX_USE_GFILE && GFILE_NEED_FATFS && GFX_USE_OS_CHIBIOS && !GFILE_FATFS_EXTERNAL_LIB 
   14 #if HAL_USE_MMC_SPI && HAL_USE_SDC 
   15     #error "cannot specify both MMC_SPI and SDC drivers" 
   19     extern MMCDriver MMCD1;
 
   21     extern SDCDriver SDCD1;
 
   23     #error "MMC_SPI or SDC driver must be specified" 
   43 #if CH_KERNEL_MAJOR > 2 
   44     #define CPU_CACHE_LINE_SIZE         32 
   45     #define CACHE_FLUSH(buf, sz)        dmaBufferFlush((buf), (sz)+(CPU_CACHE_LINE_SIZE-1)) 
   46     #define CACHE_INVALIDATE(buf, sz)   dmaBufferInvalidate((buf), (sz)+(CPU_CACHE_LINE_SIZE-1)) 
   48     #define CACHE_FLUSH(buf, sz) 
   49     #define CACHE_INVALIDATE(buf, sz) 
   53 DSTATUS disk_initialize (
 
   64     if (blkGetDriverState(&MMCD1) != BLK_READY)
 
   66     if (mmcIsWriteProtected(&MMCD1))
 
   73     if (blkGetDriverState(&SDCD1) != BLK_READY)
 
   75     if (sdcIsWriteProtected(&SDCD1))
 
   99     if (blkGetDriverState(&MMCD1) != BLK_READY)
 
  101     if (mmcIsWriteProtected(&MMCD1))
 
  108     if (blkGetDriverState(&SDCD1) != BLK_READY)
 
  110     if (sdcIsWriteProtected(&SDCD1))
 
  133     if (blkGetDriverState(&MMCD1) != BLK_READY)
 
  135     if (mmcStartSequentialRead(&MMCD1, sector))
 
  137     CACHE_FLUSH(buff, MMCSD_BLOCK_SIZE*count);
 
  139       if (mmcSequentialRead(&MMCD1, buff))
 
  141       buff += MMCSD_BLOCK_SIZE;
 
  144     if (mmcStopSequentialRead(&MMCD1))
 
  146     CACHE_INVALIDATE(buff, MMCSD_BLOCK_SIZE*count);
 
  150     if (blkGetDriverState(&SDCD1) != BLK_READY)
 
  152     CACHE_FLUSH(buff, MMCSD_BLOCK_SIZE*count);
 
  153     if (sdcRead(&SDCD1, sector, buff, count))
 
  155     CACHE_INVALIDATE(buff, MMCSD_BLOCK_SIZE*count);
 
  178     if (blkGetDriverState(&MMCD1) != BLK_READY)
 
  180     if (mmcIsWriteProtected(&MMCD1))
 
  182     if (mmcStartSequentialWrite(&MMCD1, sector))
 
  184     CACHE_FLUSH(buff, MMCSD_BLOCK_SIZE*count);
 
  186         if (mmcSequentialWrite(&MMCD1, buff))
 
  188         buff += MMCSD_BLOCK_SIZE;
 
  191     if (mmcStopSequentialWrite(&MMCD1))
 
  196     if (blkGetDriverState(&SDCD1) != BLK_READY)
 
  198     CACHE_FLUSH(buff, MMCSD_BLOCK_SIZE*count);
 
  199     if (sdcWrite(&SDCD1, sector, buff, count))
 
  225     case GET_SECTOR_SIZE:
 
  226         *((WORD *)buff) = MMCSD_BLOCK_SIZE;
 
  229     case CTRL_ERASE_SECTOR:
 
  230         mmcErase(&MMCD1, *((DWORD *)buff), *((DWORD *)buff + 1));
 
  241     case GET_SECTOR_COUNT:
 
  242         *((DWORD *)buff) = mmcsdGetCardCapacity(&SDCD1);
 
  244     case GET_SECTOR_SIZE:
 
  245         *((WORD *)buff) = MMCSD_BLOCK_SIZE;
 
  248         *((DWORD *)buff) = 256; 
 
  251     case CTRL_ERASE_SECTOR:
 
  252         sdcErase(&SDCD1, *((DWORD *)buff), *((DWORD *)buff + 1));
 
  264     extern RTCDriver RTCD1;
 
  266     DWORD get_fattime(
void) {
 
  267         RTCDateTime timespec;
 
  269         rtcGetTime(&RTCD1, ×pec);
 
  270         return rtcConvertDateTimeToFAT(×pec);
 
  273     DWORD get_fattime(
void) {
 
  274         return ((gU32)0 | (1 << 16)) | (1 << 21);