Skip to content

Commit 0cd86ea

Browse files
committed
sdcard: replace VLA with static buffer, add card presence guard
1 parent 37b91ab commit 0cd86ea

1 file changed

Lines changed: 46 additions & 30 deletions

File tree

src/sdcard/sdcard.c

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,25 @@
44

55
#include "../bus/uart/uart.h"
66
#include "../commands.h"
7-
#include "fatfs/ff.h"
8-
#include "fatfs/ffconf.h"
97
#include "../helpers/debug.h"
108
#include "../registers/system/watchdog.h"
9+
#include "fatfs/ff.h"
10+
#include "fatfs/ffconf.h"
11+
#include "sd_spi.h"
1112

1213
#define SFN_MAX 8
1314
#define SFN_SUFFIX_LEN 4 // Period + at most three chars.
1415
#define BUF_MAX FF_MIN_SS
16+
#define SDCARD_DRIVE "0:"
1517

16-
static void get_filename(TCHAR* const fn_buf, UINT const size) {
18+
static TCHAR s_sector_buf[BUF_MAX];
19+
_Static_assert(
20+
sizeof(s_sector_buf) == 512,
21+
"SD sector buffer must be 512 bytes"
22+
);
23+
24+
static void get_filename(TCHAR *const fn_buf, UINT const size)
25+
{
1726
for (UINT i = 0; i < size; ++i) {
1827
if (!(fn_buf[i] = UART1_Read())) {
1928
// Received null-terminator.
@@ -24,15 +33,20 @@ static void get_filename(TCHAR* const fn_buf, UINT const size) {
2433
// manual check for null-termination.
2534
}
2635

27-
response_t SDCARD_write_file(void) {
36+
response_t SDCARD_write_file(void)
37+
{
2838
// +1 is null-terminator.
2939
size_t const filename_size = SFN_MAX + SFN_SUFFIX_LEN + 1;
3040
TCHAR filename[filename_size];
3141
get_filename(filename, filename_size);
3242
BYTE const mode = UART1_Read();
3343

44+
if (!SD_SPI_IsMediaPresent()) {
45+
UART1_Write(FR_NOT_READY);
46+
return DO_NOT_BOTHER;
47+
}
3448
FATFS drive;
35-
DEBUG_write_u8(f_mount(&drive, "0:", 1));
49+
DEBUG_write_u8(f_mount(&drive, SDCARD_DRIVE, 1));
3650

3751
FIL file;
3852
// Host must wait for f_open before sending data.
@@ -41,38 +55,39 @@ response_t SDCARD_write_file(void) {
4155
FSIZE_t data_size = UART1_read_u32();
4256
FSIZE_t bytes_written = 0;
4357

44-
for (
45-
FSIZE_t block_size, remaining = data_size;
46-
block_size = remaining > BUF_MAX ? BUF_MAX : remaining,
47-
remaining;
48-
remaining -= block_size
49-
) {
50-
TCHAR buffer[block_size];
58+
for (FSIZE_t block_size, remaining = data_size;
59+
block_size = remaining > BUF_MAX ? BUF_MAX : remaining, remaining;
60+
remaining -= block_size) {
5161

5262
for (UINT i = 0; i < block_size; ++i) {
53-
buffer[i] = UART1_Read();
63+
s_sector_buf[i] = UART1_Read();
5464
}
5565

5666
WATCHDOG_TimerClear();
5767
UINT written = 0;
5868
// Host must wait for f_write before sending more data.
59-
UART1_Write(f_write(&file, buffer, (UINT)block_size, &written));
69+
UART1_Write(f_write(&file, s_sector_buf, (UINT)block_size, &written));
6070
bytes_written += written;
6171
}
6272

6373
UART1_write_u32(bytes_written);
6474
DEBUG_write_u8(f_close(&file));
65-
DEBUG_write_u8(f_mount(0, "0:", 0));
75+
DEBUG_write_u8(f_mount(0, SDCARD_DRIVE, 0));
6676

6777
return DO_NOT_BOTHER;
6878
}
6979

70-
response_t SDCARD_read_file(void) {
80+
response_t SDCARD_read_file(void)
81+
{
7182
TCHAR filename[SFN_MAX + SFN_SUFFIX_LEN + 1]; // +1 is null-terminator.
7283
get_filename(filename, sizeof filename);
7384

85+
if (!SD_SPI_IsMediaPresent()) {
86+
UART1_Write(FR_NOT_READY);
87+
return DO_NOT_BOTHER;
88+
}
7489
FATFS drive;
75-
DEBUG_write_u8(f_mount(&drive, "0:", 1));
90+
DEBUG_write_u8(f_mount(&drive, SDCARD_DRIVE, 1));
7691

7792
FIL file;
7893
DEBUG_write_u8(f_open(&file, filename, FA_READ));
@@ -82,36 +97,37 @@ response_t SDCARD_read_file(void) {
8297
UART1_write_u32(info.fsize);
8398
FSIZE_t bytes_read = 0;
8499

85-
for (
86-
FSIZE_t block_size, remaining = info.fsize;
87-
block_size = remaining > BUF_MAX ? BUF_MAX : remaining,
88-
remaining;
89-
remaining -= block_size
90-
) {
100+
for (FSIZE_t block_size, remaining = info.fsize;
101+
block_size = remaining > BUF_MAX ? BUF_MAX : remaining, remaining;
102+
remaining -= block_size) {
91103
WATCHDOG_TimerClear();
92104
UINT read = 0;
93-
TCHAR buffer[block_size];
94-
f_read(&file, &buffer, (UINT)block_size, &read);
105+
f_read(&file, s_sector_buf, (UINT)block_size, &read);
95106
bytes_read += read;
96107

97108
for (UINT i = 0; i < block_size; ++i) {
98-
UART1_Write(buffer[i]);
109+
UART1_Write(s_sector_buf[i]);
99110
}
100111
}
101112

102113
UART1_write_u32(bytes_read);
103114
DEBUG_write_u8(f_close(&file));
104-
DEBUG_write_u8(f_mount(0, "0:", 0));
115+
DEBUG_write_u8(f_mount(0, SDCARD_DRIVE, 0));
105116

106117
return DO_NOT_BOTHER;
107118
}
108119

109-
response_t SDCARD_get_file_info(void) {
120+
response_t SDCARD_get_file_info(void)
121+
{
110122
TCHAR filename[SFN_MAX + SFN_SUFFIX_LEN + 1]; // +1 is null-terminator.
111123
get_filename(filename, sizeof filename);
112124

125+
if (!SD_SPI_IsMediaPresent()) {
126+
UART1_Write(FR_NOT_READY);
127+
return DO_NOT_BOTHER;
128+
}
113129
FATFS drive;
114-
DEBUG_write_u8(f_mount(&drive, "0:", 1));
130+
DEBUG_write_u8(f_mount(&drive, SDCARD_DRIVE, 1));
115131

116132
FILINFO info = {0, 0, 0, 0, {0}};
117133
DEBUG_write_u8(f_stat(filename, &info));
@@ -121,7 +137,7 @@ response_t SDCARD_get_file_info(void) {
121137
UART1_WriteInt(info.ftime);
122138
UART1_Write(info.fattrib);
123139

124-
DEBUG_write_u8(f_mount(0, "0:", 0));
140+
DEBUG_write_u8(f_mount(0, SDCARD_DRIVE, 0));
125141

126142
return SUCCESS;
127143
}

0 commit comments

Comments
 (0)