Upgrade gcc4mbed project used by Smoothie.
[clinton/Smoothieware.git] / src / libs / ChaNFS / CHAN_FS / diskio.cpp
CommitLineData
d9ebc974
AW
1/*-----------------------------------------------------------------------*/\r
2/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */\r
3/*-----------------------------------------------------------------------*/\r
4/* This is a stub disk I/O module that acts as front end of the existing */\r
5/* disk I/O modules and attach it to FatFs module with common interface. */\r
6/*-----------------------------------------------------------------------*/\r
7\r
8#include "diskio.h"\r
9#include <stdio.h>\r
10#include <string.h>\r
11#include "FATFileSystem.h"\r
12\r
13#include "mbed.h"\r
14\r
15DSTATUS disk_initialize (\r
16 BYTE drv /* Physical drive nmuber (0..) */\r
17) \r
18{\r
19 FFSDEBUG("disk_initialize on drv [%d]\n", drv);\r
20 return (DSTATUS)FATFileSystem::_ffs[drv]->disk_initialize();\r
21}\r
22\r
23DSTATUS disk_status (\r
24 BYTE drv /* Physical drive nmuber (0..) */\r
25) \r
26{\r
27 FFSDEBUG("disk_status on drv [%d]\n", drv);\r
28 return (DSTATUS)FATFileSystem::_ffs[drv]->disk_status();\r
29}\r
30\r
31DRESULT disk_read (\r
32 BYTE drv, /* Physical drive nmuber (0..) */\r
33 BYTE *buff, /* Data buffer to store read data */\r
34 DWORD sector, /* Sector address (LBA) */\r
35 BYTE count /* Number of sectors to read (1..255) */\r
36)\r
37{\r
38 FFSDEBUG("disk_read(sector %d, count %d) on drv [%d]\n", sector, count, drv);\r
39 for(int s=sector; s<sector+count; s++) {\r
40 FFSDEBUG(" disk_read(sector %d)\n", s);\r
41 int res = FATFileSystem::_ffs[drv]->disk_read((char*)buff, s);\r
42 if(res) {\r
43 return RES_PARERR;\r
44 }\r
45 buff += 512;\r
46 }\r
47 return RES_OK;\r
48}\r
49\r
50#if _READONLY == 0\r
51DRESULT disk_write (\r
52 BYTE drv, /* Physical drive nmuber (0..) */\r
53 const BYTE *buff, /* Data to be written */\r
54 DWORD sector, /* Sector address (LBA) */\r
55 BYTE count /* Number of sectors to write (1..255) */\r
56)\r
57{\r
58 FFSDEBUG("disk_write(sector %d, count %d) on drv [%d]\n", sector, count, drv);\r
59 for(int s=sector; s<sector+count; s++) {\r
60 FFSDEBUG(" disk_write(sector %d)\n", s);\r
61 int res = FATFileSystem::_ffs[drv]->disk_write((char*)buff, sector);\r
62 if(res) {\r
63 return RES_PARERR;\r
64 }\r
65 buff += 512;\r
66 }\r
67 return RES_OK;\r
68}\r
69#endif /* _READONLY */\r
70\r
71DRESULT disk_ioctl (\r
72 BYTE drv, /* Physical drive nmuber (0..) */\r
73 BYTE ctrl, /* Control code */\r
74 void *buff /* Buffer to send/receive control data */\r
75)\r
76{\r
77 FFSDEBUG("disk_ioctl(%d)\n", ctrl);\r
78 switch(ctrl) {\r
79 case CTRL_SYNC:\r
80 if(FATFileSystem::_ffs[drv] == NULL) {\r
81 return RES_NOTRDY;\r
82 } else if(FATFileSystem::_ffs[drv]->disk_sync()) {\r
83 return RES_ERROR;\r
84 } \r
85 return RES_OK;\r
86 case GET_SECTOR_COUNT:\r
87 if(FATFileSystem::_ffs[drv] == NULL) {\r
88 return RES_NOTRDY;\r
89 } else {\r
90 int res = FATFileSystem::_ffs[drv]->disk_sectors();\r
91 if(res > 0) {\r
92 *((DWORD*)buff) = res; // minimum allowed\r
93 return RES_OK;\r
94 } else {\r
95 return RES_ERROR;\r
96 }\r
97 }\r
98 case GET_BLOCK_SIZE:\r
99 *((DWORD*)buff) = 1; // default when not known\r
100 return RES_OK;\r
101\r
102 }\r
103 return RES_PARERR;\r
104}\r
105\r