1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
24
25
29
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
64
76
77
82
86
87
95
96
97
98
99
100
101
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
128
129
130
131
132
133
140
141
142
143
144
145
146
147
148
149
150
155
161
167
172
174
175
176
177
178
/* ... */
#include "ff_gen_drv.h"
#include "sdram_diskio.h"
Includes
#define BLOCK_SIZE 512
Private define
static volatile DSTATUS Stat = STA_NOINIT;
Private variables
DSTATUS SDRAMDISK_initialize (BYTE);
DSTATUS SDRAMDISK_status (BYTE);
DRESULT SDRAMDISK_read (BYTE, BYTE*, DWORD, UINT);
#if _USE_WRITE == 1
DRESULT SDRAMDISK_write (BYTE, const BYTE*, DWORD, UINT);
#endif
#if _USE_IOCTL == 1
DRESULT SDRAMDISK_ioctl (BYTE, BYTE, void*);
#endif
const Diskio_drvTypeDef SDRAMDISK_Driver =
{
SDRAMDISK_initialize,
SDRAMDISK_status,
SDRAMDISK_read,
#if _USE_WRITE
SDRAMDISK_write,
#endif
#if _USE_IOCTL == 1
SDRAMDISK_ioctl,
#endif
...};
Private function prototypes
/* ... */
DSTATUS SDRAMDISK_initialize(BYTE lun)
{
Stat = STA_NOINIT;
if(BSP_SDRAM_Init() == SDRAM_OK)
{
Stat &= ~STA_NOINIT;
}if (BSP_SDRAM_Init() == SDRAM_OK) { ... }
return Stat;
}{ ... }
/* ... */
DSTATUS SDRAMDISK_status(BYTE lun)
{
return Stat;
}{ ... }
/* ... */
DRESULT SDRAMDISK_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
uint32_t *pSrcBuffer = (uint32_t *)buff;
uint32_t BufferSize = (BLOCK_SIZE * count)/4;
uint32_t *pSdramAddress = (uint32_t *) (SDRAM_DEVICE_ADDR + (sector * BLOCK_SIZE));
for(; BufferSize != 0; BufferSize--)
{
*pSrcBuffer++ = *(__IO uint32_t *)pSdramAddress++;
}for (; BufferSize != 0; BufferSize--) { ... }
return RES_OK;
}{ ... }
/* ... */
#if _USE_WRITE == 1
DRESULT SDRAMDISK_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
uint32_t *pDstBuffer = (uint32_t *)buff;
uint32_t BufferSize = (BLOCK_SIZE * count)/4;
uint32_t *pSramAddress = (uint32_t *) (SDRAM_DEVICE_ADDR + (sector * BLOCK_SIZE));
for(; BufferSize != 0; BufferSize--)
{
*(__IO uint32_t *)pSramAddress++ = *pDstBuffer++;
}for (; BufferSize != 0; BufferSize--) { ... }
return RES_OK;
}{ ... }
/* ... */#endif
/* ... */
#if _USE_IOCTL == 1
DRESULT SDRAMDISK_ioctl(BYTE lun, BYTE cmd, void *buff)
{
DRESULT res = RES_ERROR;
if (Stat & STA_NOINIT) return RES_NOTRDY;
switch (cmd)
{
case CTRL_SYNC :
res = RES_OK;
break;
case CTRL_SYNC :
case GET_SECTOR_COUNT :
*(DWORD*)buff = SDRAM_DEVICE_SIZE / BLOCK_SIZE;
res = RES_OK;
break;
case GET_SECTOR_COUNT :
case GET_SECTOR_SIZE :
*(WORD*)buff = BLOCK_SIZE;
res = RES_OK;
break;
case GET_SECTOR_SIZE :
case GET_BLOCK_SIZE :
*(DWORD*)buff = 1;
res = RES_OK;
break;
case GET_BLOCK_SIZE :
default:
res = RES_PARERR;default
}switch (cmd) { ... }
return res;
}{ ... }
/* ... */#endifPrivate functions