Skip to content

Commit d2d8bda

Browse files
Update dosfs driver interface to avoid open read operations with the SDCARD unselected
1 parent 3d195fc commit d2d8bda

File tree

13 files changed

+427
-461
lines changed

13 files changed

+427
-461
lines changed

system/STM32L4xx/Include/dosfs_api.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ extern int f_delvolume(void);
174174
extern int f_checkvolume(void);
175175
extern int f_format(int fattype);
176176
extern int f_hardformat(int fattype);
177-
extern int f_reclaim(long size);
178177
extern int f_getfreespace(F_SPACE *pspace);
179178
extern int f_getserial(unsigned long *p_serial);
180179
extern int f_setlabel(const char *volname);

system/STM32L4xx/Include/dosfs_driver.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,11 @@ typedef struct _dosfs_interface_t {
5454
int (*release)(void *context);
5555
int (*info)(void *context, uint8_t *p_type, uint8_t *p_write_protected, uint32_t *p_block_count, uint32_t *p_au_size, uint32_t *p_serial);
5656
int (*format)(void *context);
57-
int (*reclaim)(void *context, uint32_t size);
57+
int (*erase)(void *context, uint32_t address, uint32_t length);
5858
int (*discard)(void *context, uint32_t address, uint32_t length);
59-
int (*read)(void *context, uint32_t address, uint8_t *data);
60-
int (*read_sequential)(void *context, uint32_t address, uint32_t length, uint8_t *data);
61-
int (*write)(void *context, uint32_t address, const uint8_t *data);
62-
int (*write_sequential)(void *context, uint32_t address, uint32_t length, const uint8_t *data, volatile uint8_t *p_status);
63-
int (*sync)(void *context, volatile uint8_t *p_status);
59+
int (*read)(void *context, uint32_t address, uint32_t length, uint8_t *data);
60+
int (*write)(void *context, uint32_t address, uint32_t length, const uint8_t *data, volatile uint8_t *p_status);
61+
int (*sync)(void *context);
6462
} dosfs_interface_t;
6563

6664
#ifdef __cplusplus

system/STM32L4xx/Include/dosfs_port.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ static inline void stm32l4_system_timedate(uint16_t *p_time, uint16_t *p_date)
6262
#define DOSFS_PORT_SDCARD_SPI_DESELECT(_sdcard) stm32l4_sdcard_spi_deselect((_sdcard))
6363
#define DOSFS_PORT_SDCARD_SPI_SEND(_sdcard, _data) stm32l4_sdcard_spi_send((_sdcard), (_data))
6464
#define DOSFS_PORT_SDCARD_SPI_RECEIVE(_sdcard) stm32l4_sdcard_spi_receive((_sdcard))
65-
6665
#define DOSFS_PORT_SDCARD_SPI_SEND_BLOCK(_sdcard, _data) stm32l4_sdcard_spi_send_block((_sdcard), (_data))
6766
#define DOSFS_PORT_SDCARD_SPI_RECEIVE_BLOCK(_sdcard, _data) stm32l4_sdcard_spi_receive_block((_sdcard), (_data))
6867

system/STM32L4xx/Include/dosfs_sdcard.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ typedef struct _dosfs_sdcard_t dosfs_sdcard_t;
4848
#define DOSFS_SDCARD_STATE_INIT 1
4949
#define DOSFS_SDCARD_STATE_RESET 2
5050
#define DOSFS_SDCARD_STATE_READY 3
51-
#define DOSFS_SDCARD_STATE_READ_SEQUENTIAL 4
52-
#define DOSFS_SDCARD_STATE_WRITE_SEQUENTIAL 5
51+
#define DOSFS_SDCARD_STATE_WRITE_MULTIPLE 4
5352

5453
#define DOSFS_SDCARD_TYPE_NONE 0
5554
#define DOSFS_SDCARD_TYPE_SDSC 1
@@ -89,11 +88,11 @@ struct _dosfs_sdcard_t {
8988
uint32_t sdcard_receive_data;
9089
uint32_t sdcard_receive_data_retry;
9190
uint32_t sdcard_receive_data_fail;
91+
uint32_t sdcard_erase;
9292
uint32_t sdcard_read_single;
93-
uint32_t sdcard_read_sequential;
94-
uint32_t sdcard_read_coalesce;
93+
uint32_t sdcard_read_multiple;
9594
uint32_t sdcard_write_single;
96-
uint32_t sdcard_write_sequential;
95+
uint32_t sdcard_write_multiple;
9796
uint32_t sdcard_write_coalesce;
9897
} statistics;
9998
#endif /* (DOSFS_CONFIG_STATISTICS == 1) */
550 Bytes
Binary file not shown.
550 Bytes
Binary file not shown.
-5.58 KB
Binary file not shown.

system/STM32L4xx/Source/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ _out/stm32l476/%.o: %.S
110110
clean::
111111
rm -rf libstm32l432.a libstm32l433.a libstm32l476.a _out
112112

113-
-include $(OBJS:.o=.d)
113+
-include $(OBJS_L432:.o=.d)
114+
-include $(OBJS_L433:.o=.d)
115+
-include $(OBJS_L476:.o=.d)
114116

115117

system/STM32L4xx/Source/dosfs_core.c

Lines changed: 49 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,7 @@ static int dosfs_volume_read(dosfs_volume_t *volume, uint32_t address, uint8_t *
11001100

11011101
do
11021102
{
1103-
status = (*volume->interface->read_sequential)(volume->context, address, 1, data);
1103+
status = (*volume->interface->read)(volume->context, address, 1, data);
11041104

11051105
if ((status == F_ERR_ONDRIVE) && (retries >= 1))
11061106
{
@@ -1143,7 +1143,7 @@ static int dosfs_volume_write(dosfs_volume_t *volume, uint32_t address, const ui
11431143

11441144
do
11451145
{
1146-
status = (*volume->interface->write)(volume->context, address, data);
1146+
status = (*volume->interface->write)(volume->context, address, 1, data, NULL);
11471147

11481148
if ((status == F_ERR_ONDRIVE) && (retries >= 1))
11491149
{
@@ -1183,7 +1183,7 @@ static int dosfs_volume_write(dosfs_volume_t *volume, uint32_t address, const ui
11831183
static int dosfs_volume_zero(dosfs_volume_t *volume, uint32_t address, uint32_t length, volatile uint8_t *p_status)
11841184
{
11851185
int status = F_NO_ERROR;
1186-
uint8_t *data;
1186+
uint8_t *data, zero_status;
11871187

11881188
status = dosfs_dir_cache_flush(volume);
11891189

@@ -1194,9 +1194,11 @@ static int dosfs_volume_zero(dosfs_volume_t *volume, uint32_t address, uint32_t
11941194

11951195
memset(data, 0, DOSFS_BLK_SIZE);
11961196

1197+
zero_status = F_NO_ERROR;
1198+
11971199
do
11981200
{
1199-
status = (*volume->interface->write_sequential)(volume->context, address, 1, data, p_status);
1201+
status = (*volume->interface->write)(volume->context, address, 1, data, (p_status ? p_status : &zero_status));
12001202

12011203
if (status == F_NO_ERROR)
12021204
{
@@ -1207,6 +1209,19 @@ static int dosfs_volume_zero(dosfs_volume_t *volume, uint32_t address, uint32_t
12071209
length--;
12081210
}
12091211
while ((status == F_NO_ERROR) && length);
1212+
1213+
if (p_status == NULL)
1214+
{
1215+
if (status == F_NO_ERROR)
1216+
{
1217+
status = (*volume->interface->sync)(volume->context);
1218+
1219+
if (status == F_NO_ERROR)
1220+
{
1221+
status = zero_status;
1222+
}
1223+
}
1224+
}
12101225
}
12111226

12121227
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
@@ -1218,11 +1233,6 @@ static int dosfs_volume_zero(dosfs_volume_t *volume, uint32_t address, uint32_t
12181233

12191234
if (p_status == NULL)
12201235
{
1221-
if (status == F_NO_ERROR)
1222-
{
1223-
status = (*volume->interface->sync)(volume->context, NULL);
1224-
}
1225-
12261236
if (status != F_NO_ERROR)
12271237
{
12281238
if (status != F_ERR_CARDREMOVED)
@@ -2738,7 +2748,7 @@ static int dosfs_dir_cache_write(dosfs_volume_t *volume)
27382748
{
27392749
dosfs_file_t *file = volume->data_file;
27402750

2741-
status = (*volume->interface->write_sequential)(volume->context, volume->dir_cache.blkno, 1, volume->dir_cache.data, &file->status);
2751+
status = (*volume->interface->write)(volume->context, volume->dir_cache.blkno, 1, volume->dir_cache.data, &file->status);
27422752

27432753
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
27442754
if (status == F_ERR_INVALIDSECTOR)
@@ -3682,7 +3692,7 @@ static int dosfs_data_cache_write(dosfs_volume_t *volume, dosfs_file_t *file)
36823692
{
36833693
int status = F_NO_ERROR;
36843694

3685-
status = (*volume->interface->write_sequential)(volume->context, file->data_cache.blkno, 1, file->data_cache.data, &file->status);
3695+
status = (*volume->interface->write)(volume->context, file->data_cache.blkno, 1, file->data_cache.data, &file->status);
36863696

36873697
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
36883698
if (status == F_ERR_INVALIDSECTOR)
@@ -3738,7 +3748,7 @@ static int dosfs_data_cache_fill(dosfs_volume_t *volume, dosfs_file_t *file, uin
37383748
}
37393749
else
37403750
{
3741-
status = (*volume->interface->read_sequential)(volume->context, blkno, 1, file->data_cache.data);
3751+
status = (*volume->interface->read)(volume->context, blkno, 1, file->data_cache.data);
37423752

37433753
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
37443754
if (status == F_ERR_INVALIDSECTOR)
@@ -3844,7 +3854,7 @@ static int dosfs_data_cache_write(dosfs_volume_t *volume, dosfs_file_t *file)
38443854
{
38453855
int status = F_NO_ERROR;
38463856

3847-
status = (*volume->interface->write_sequential)(volume->context, volume->data_cache.blkno, 1, volume->data_cache.data, &file->status);
3857+
status = (*volume->interface->write)(volume->context, volume->data_cache.blkno, 1, volume->data_cache.data, &file->status);
38483858

38493859
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
38503860
if (status == F_ERR_INVALIDSECTOR)
@@ -3899,7 +3909,7 @@ static int dosfs_data_cache_fill(dosfs_volume_t *volume, dosfs_file_t *file, uin
38993909
}
39003910
else
39013911
{
3902-
status = (*volume->interface->read_sequential)(volume->context, blkno, 1, volume->data_cache.data);
3912+
status = (*volume->interface->read)(volume->context, blkno, 1, volume->data_cache.data);
39033913

39043914
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
39053915
if (status == F_ERR_INVALIDSECTOR)
@@ -4043,7 +4053,7 @@ static int dosfs_data_cache_fill(dosfs_volume_t *volume, dosfs_file_t *file, uin
40434053
}
40444054
else
40454055
{
4046-
status = (*volume->interface->read_sequential)(volume->context, blkno, 1, volume->dir_cache.data);
4056+
status = (*volume->interface->read)(volume->context, blkno, 1, volume->dir_cache.data);
40474057

40484058
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
40494059
if (status == F_ERR_INVALIDSECTOR)
@@ -7865,7 +7875,7 @@ static int dosfs_file_flush(dosfs_volume_t *volume, dosfs_file_t *file, int clos
78657875

78667876
if (status == F_NO_ERROR)
78677877
{
7868-
status = (*volume->interface->sync)(volume->context, &file->status);
7878+
status = (*volume->interface->sync)(volume->context);
78697879
}
78707880

78717881
if (file->status == F_NO_ERROR)
@@ -8515,7 +8525,7 @@ static int dosfs_file_extend(dosfs_volume_t *volume, dosfs_file_t *file, uint32_
85158525
static int dosfs_file_reserve(dosfs_volume_t *volume, dosfs_file_t *file, uint32_t size)
85168526
{
85178527
int status = F_NO_ERROR;
8518-
uint32_t clsno_a, clscnt;
8528+
uint32_t clsno_a, clscnt, blkno, blkno_e;
85198529

85208530
clscnt = DOSFS_SIZE_TO_CLSCNT(size);
85218531
clscnt = ((((clscnt << volume->cls_blk_shift) + (volume->blk_unit_size -1)) / volume->blk_unit_size) * volume->blk_unit_size) >> volume->cls_blk_shift;
@@ -8543,6 +8553,19 @@ static int dosfs_file_reserve(dosfs_volume_t *volume, dosfs_file_t *file, uint32
85438553
*/
85448554

85458555
status = dosfs_file_sync(volume, file, FALSE, FALSE, file->first_clsno, file->length);
8556+
8557+
if (status == F_NO_ERROR)
8558+
{
8559+
for (blkno = file->blkno, blkno_e = blkno + (clscnt << volume->cls_blk_shift); blkno < blkno_e; blkno += volume->blk_unit_size)
8560+
{
8561+
status = (*volume->interface->erase)(volume->context, blkno, volume->blk_unit_size);
8562+
8563+
if (status != F_NO_ERROR)
8564+
{
8565+
break;
8566+
}
8567+
}
8568+
}
85468569
}
85478570
}
85488571

@@ -9040,7 +9063,7 @@ static int dosfs_file_read(dosfs_volume_t *volume, dosfs_file_t *file, uint8_t *
90409063

90419064
if (status == F_NO_ERROR)
90429065
{
9043-
status = (*volume->interface->read_sequential)(volume->context, blkno, blkcnt, data);
9066+
status = (*volume->interface->read)(volume->context, blkno, blkcnt, data);
90449067

90459068
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
90469069
if (status == F_ERR_INVALIDSECTOR)
@@ -9336,7 +9359,7 @@ static int dosfs_file_write(dosfs_volume_t *volume, dosfs_file_t *file, const ui
93369359

93379360
if (status == F_NO_ERROR)
93389361
{
9339-
status = (*volume->interface->write_sequential)(volume->context, blkno, blkcnt, data, &file->status);
9362+
status = (*volume->interface->write)(volume->context, blkno, blkcnt, data, &file->status);
93409363

93419364
#if (DOSFS_CONFIG_MEDIA_FAILURE_SUPPORTED == 1)
93429365
if (status == F_ERR_INVALIDSECTOR)
@@ -9372,7 +9395,12 @@ static int dosfs_file_write(dosfs_volume_t *volume, dosfs_file_t *file, const ui
93729395
{
93739396
if (file->mode & DOSFS_FILE_MODE_COMMIT)
93749397
{
9375-
status = (*volume->interface->sync)(volume->context, &file->status);
9398+
status = (*volume->interface->sync)(volume->context);
9399+
}
9400+
9401+
if (file->status != F_NO_ERROR)
9402+
{
9403+
status = file->status;
93769404
}
93779405

93789406
if (status == F_NO_ERROR)
@@ -9528,36 +9556,6 @@ int f_hardformat(int fattype)
95289556
}
95299557

95309558

9531-
int f_reclaim(long size)
9532-
{
9533-
int status = F_NO_ERROR;
9534-
dosfs_volume_t *volume;
9535-
9536-
volume = DOSFS_DEFAULT_VOLUME();
9537-
9538-
status = dosfs_volume_lock(volume);
9539-
9540-
if (status == F_NO_ERROR)
9541-
{
9542-
if (volume->flags & DOSFS_VOLUME_FLAG_WRITE_PROTECTED)
9543-
{
9544-
status = F_ERR_WRITEPROTECT;
9545-
}
9546-
else
9547-
{
9548-
if (status == F_NO_ERROR)
9549-
{
9550-
status = (*volume->interface->reclaim)(volume->context, (size + (DOSFS_BLK_SIZE-1)) / DOSFS_BLK_SIZE);
9551-
}
9552-
}
9553-
9554-
status = dosfs_volume_unlock(volume, status);
9555-
}
9556-
9557-
return status;
9558-
}
9559-
9560-
95619559
int f_getfreespace(F_SPACE *pspace)
95629560
{
95639561
int status = F_NO_ERROR;
@@ -11579,7 +11577,7 @@ int f_rewind(F_FILE *file)
1157911577

1158011578
if (status == F_NO_ERROR)
1158111579
{
11582-
status = (*volume->interface->sync)(volume->context, &file->status);
11580+
status = (*volume->interface->sync)(volume->context);
1158311581

1158411582
if (status == F_NO_ERROR)
1158511583
{

0 commit comments

Comments
 (0)