1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
24
25
26
27
28
29
30
31
32
33
34
35
36
37
42
43
44
45
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
87
88
93
94
95
96
97
103
104
105
106
107
108
109
114
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
166
167
168
169
170
171
172
173
180
181
182
183
184
185
186
187
188
189
190
191
196
203
210
216
218
219
220
221
222
/* ... */
#include "ff_gen_drv.h"
#include "sd_diskio.h"
Includes
#if defined(SDMMC_DATATIMEOUT)
#define SD_TIMEOUT SDMMC_DATATIMEOUT
#elif defined(SD_DATATIMEOUT)
#define SD_TIMEOUT SD_DATATIMEOUT
#else
#define SD_TIMEOUT 30 * 1000
#endif
#define SD_DEFAULT_BLOCK_SIZE 512
/* ... */
Private define
static volatile DSTATUS Stat = STA_NOINIT;
Private variables
static DSTATUS SD_CheckStatus(BYTE lun);
DSTATUS SD_initialize (BYTE);
DSTATUS SD_status (BYTE);
DRESULT SD_read (BYTE, BYTE*, DWORD, UINT);
#if _USE_WRITE == 1
DRESULT SD_write (BYTE, const BYTE*, DWORD, UINT);
#endif
#if _USE_IOCTL == 1
DRESULT SD_ioctl (BYTE, BYTE, void*);
#endif
const Diskio_drvTypeDef SD_Driver =
{
SD_initialize,
SD_status,
SD_read,
#if _USE_WRITE == 1
SD_write,
#endif
#if _USE_IOCTL == 1
SD_ioctl,
#endif
...};
Private function prototypes
static DSTATUS SD_CheckStatus(BYTE lun)
{
Stat = STA_NOINIT;
if(BSP_SD_GetCardState() == MSD_OK)
{
Stat &= ~STA_NOINIT;
}if (BSP_SD_GetCardState() == MSD_OK) { ... }
return Stat;
}{ ... }
/* ... */
DSTATUS SD_initialize(BYTE lun)
{
Stat = STA_NOINIT;
#if !defined(DISABLE_SD_INIT)
if(BSP_SD_Init() == MSD_OK)
{
Stat = SD_CheckStatus(lun);
}if (BSP_SD_Init() == MSD_OK) { ... }
/* ... */
#else
Stat = SD_CheckStatus(lun);
#endif
return Stat;
}{ ... }
/* ... */
DSTATUS SD_status(BYTE lun)
{
return SD_CheckStatus(lun);
}{ ... }
/* ... */
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_ERROR;
if(BSP_SD_ReadBlocks((uint32_t*)buff,
(uint32_t) (sector),
count, SD_TIMEOUT) == MSD_OK)
{
while(BSP_SD_GetCardState()!= MSD_OK)
{
}while (BSP_SD_GetCardState()!= MSD_OK) { ... }
res = RES_OK;
}if (BSP_SD_ReadBlocks((uint32_t*)buff, (uint32_t) (sector), count, SD_TIMEOUT) == MSD_OK) { ... }
return res;
}{ ... }
/* ... */
#if _USE_WRITE == 1
DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_ERROR;
if(BSP_SD_WriteBlocks((uint32_t*)buff,
(uint32_t)(sector),
count, SD_TIMEOUT) == MSD_OK)
{
while(BSP_SD_GetCardState() != MSD_OK)
{
}while (BSP_SD_GetCardState() != MSD_OK) { ... }
res = RES_OK;
}if (BSP_SD_WriteBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_TIMEOUT) == MSD_OK) { ... }
return res;
}{ ... }
/* ... */#endif
/* ... */
#if _USE_IOCTL == 1
DRESULT SD_ioctl(BYTE lun, BYTE cmd, void *buff)
{
DRESULT res = RES_ERROR;
BSP_SD_CardInfo CardInfo;
if (Stat & STA_NOINIT) return RES_NOTRDY;
switch (cmd)
{
case CTRL_SYNC :
res = RES_OK;
break;
case CTRL_SYNC :
case GET_SECTOR_COUNT :
BSP_SD_GetCardInfo(&CardInfo);
*(DWORD*)buff = CardInfo.LogBlockNbr;
res = RES_OK;
break;
case GET_SECTOR_COUNT :
case GET_SECTOR_SIZE :
BSP_SD_GetCardInfo(&CardInfo);
*(WORD*)buff = CardInfo.LogBlockSize;
res = RES_OK;
break;
case GET_SECTOR_SIZE :
case GET_BLOCK_SIZE :
BSP_SD_GetCardInfo(&CardInfo);
*(DWORD*)buff = CardInfo.LogBlockSize / SD_DEFAULT_BLOCK_SIZE;
res = RES_OK;
break;
case GET_BLOCK_SIZE :
default:
res = RES_PARERR;default
}switch (cmd) { ... }
return res;
}{ ... }
/* ... */#endifPrivate functions