forked from waninkoko/fat-module
/
diskio.c
152 lines (117 loc) · 2.72 KB
/
diskio.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */
/*-----------------------------------------------------------------------*/
/* This is a stub disk I/O module that acts as front end of the existing */
/* disk I/O modules and attach it to FatFs module with common interface. */
/*-----------------------------------------------------------------------*/
#include <string.h>
#include "diskio.h"
#include "ehci.h"
#include "mem.h"
#include "sdio.h"
#include "syscalls.h"
#include "types.h"
/* Disk drives */
#define DRIVE_SDHC 0
#define DRIVE_EHCI 1
/* Disk constants */
#define SECTOR_SZ 512
DSTATUS disk_initialize(BYTE drv)
{
/* Initialize drive */
switch (drv) {
case DRIVE_SDHC:
case DRIVE_EHCI:
break;
default:
return RES_PARERR;
}
return RES_OK;
}
DSTATUS disk_status(BYTE drv)
{
s32 ret;
/* Check drive status */
switch (drv) {
case DRIVE_SDHC:
/* Check SD card status */
ret = sdio_IsInserted();
if (!ret)
return STA_NODISK;
break;
case DRIVE_EHCI:
/* Check USB device status */
ret = ehci_IsInserted();
if (!ret)
return STA_NODISK;
break;
}
return 0;
}
DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, BYTE count)
{
void *buffer;
u32 len;
s32 ret = 0;
/* Buffer length */
len = (count * SECTOR_SZ);
/* Allocate buffer */
buffer = Mem_Alloc(count * 512);
if (!buffer)
return RES_ERROR;
/* Read sectors */
switch (drv) {
case DRIVE_SDHC:
/* Read SD sectors */
ret = sdio_ReadSectors(sector, count, buffer);
break;
case DRIVE_EHCI:
/* Read USB sectors */
ret = ehci_ReadSectors(sector, count, buffer);
break;
}
/* Copy buffer */
if (ret)
memcpy(buff, buffer, len);
/* Free buffer */
Mem_Free(buffer);
return (ret) ? RES_OK : RES_ERROR;
}
#if _READONLY == 0
DRESULT disk_write(BYTE drv, const BYTE *buff, DWORD sector, BYTE count)
{
void *buffer;
u32 len;
s32 ret = 0;
/* Buffer length */
len = (count * SECTOR_SZ);
/* Allocate buffer */
buffer = Mem_Alloc(count * 512);
if (!buffer)
return RES_ERROR;
/* Copy buffer */
memcpy(buffer, buff, len);
/* Write sectors */
switch (drv) {
case DRIVE_SDHC:
/* Write SD sectors */
ret = sdio_WriteSectors(sector, count, buffer);
break;
case DRIVE_EHCI:
/* Write USB sectors */
ret = ehci_WriteSectors(sector, count, buffer);
break;
}
/* Free buffer */
Mem_Free(buffer);
return (ret) ? RES_OK : RES_ERROR;
}
#endif /* _READONLY */
DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void *buff)
{
return RES_OK;
}
u32 get_fattime(void)
{
return 0;
}