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