Skip to content

Commit dee9ccf

Browse files
Add SDCARD SDIO/SPI support; modify USB/MSC locking
1 parent e47aff0 commit dee9ccf

35 files changed

+5782
-3769
lines changed

boards.txt

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
menu.usb=USB Type
2+
menu.dosfs=DOSFS
23
menu.speed=CPU Speed
34
menu.opt=Optimize
45

@@ -30,7 +31,7 @@ Dragonfly-L476RE.build.usb_manufacturer=u"\u0324Tlera Corporation"
3031
Dragonfly-L476RE.build.usb_product=u"\u0314Dragonfly"
3132
Dragonfly-L476RE.build.vid=0x1209
3233
Dragonfly-L476RE.build.pid=0x6667
33-
Dragonfly-L476RE.build.extra_flags=-DSTM32L476xx -D__FPU_PRESENT=1 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -mslow-flash-data -fsingle-precision-constant {build.usb_flags}
34+
Dragonfly-L476RE.build.extra_flags=-DSTM32L476xx -D__FPU_PRESENT=1 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -mslow-flash-data -fsingle-precision-constant {build.usb_flags} {build.dosfs_flags}
3435
Dragonfly-L476RE.build.ldscript=linker_scripts/STM32L476RE_FLASH.ld
3536
Dragonfly-L476RE.build.openocdscript=openocd_scripts/stm32l476re_dragonfly.cfg
3637
Dragonfly-L476RE.build.variant=STM32L476RE-Dragonfly
@@ -44,6 +45,22 @@ Dragonfly-L476RE.menu.usb.cdc_msc.build.usb_type=USB_TYPE_CDC_MSC
4445
Dragonfly-L476RE.menu.usb.none=No USB
4546
Dragonfly-L476RE.menu.usb.none.build.usb_type=USB_TYPE_NONE
4647

48+
Dragonfly-L476RE.menu.dosfs.sflash=SFLASH (QSPI)
49+
Dragonfly-L476RE.menu.dosfs.sflash.build.dosfs_sdcard=0
50+
Dragonfly-L476RE.menu.dosfs.sflash.build.dosfs_sflash=2
51+
Dragonfly-L476RE.menu.dosfs.sdspi=SDCARD (SPI)
52+
Dragonfly-L476RE.menu.dosfs.sdspi.build.dosfs_sdcard=1
53+
Dragonfly-L476RE.menu.dosfs.sdspi.build.dosfs_sflash=0
54+
Dragonfly-L476RE.menu.dosfs.sdmmc=SDCARD (SDIO Default Speed)
55+
Dragonfly-L476RE.menu.dosfs.sdmmc.build.dosfs_sdcard=2
56+
Dragonfly-L476RE.menu.dosfs.sdmmc.build.dosfs_sflash=0
57+
Dragonfly-L476RE.menu.dosfs.sdmmc1=SDCARD (SDIO High Speed)
58+
Dragonfly-L476RE.menu.dosfs.sdmmc1.build.dosfs_sdcard=3
59+
Dragonfly-L476RE.menu.dosfs.sdmmc1.build.dosfs_sflash=0
60+
Dragonfly-L476RE.menu.dosfs.none=None
61+
Dragonfly-L476RE.menu.dosfs.none.build.dosfs_sdcard=0
62+
Dragonfly-L476RE.menu.dosfs.none.build.dosfs_sflash=0
63+
4764
Dragonfly-L476RE.menu.speed.80=80 MHz
4865
Dragonfly-L476RE.menu.speed.80.build.f_cpu=80000000L
4966
Dragonfly-L476RE.menu.speed.72=72 MHz
@@ -106,7 +123,7 @@ Butterfly-L433CC.build.usb_manufacturer=u"\u0324Tlera Corporation"
106123
Butterfly-L433CC.build.usb_product=u"\u0314Butterfly"
107124
Butterfly-L433CC.build.vid=0x1209
108125
Butterfly-L433CC.build.pid=0x6668
109-
Butterfly-L433CC.build.extra_flags=-DSTM32L433xx -D__FPU_PRESENT=1 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -mslow-flash-data -fsingle-precision-constant {build.usb_flags}
126+
Butterfly-L433CC.build.extra_flags=-DSTM32L433xx -D__FPU_PRESENT=1 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -mslow-flash-data -fsingle-precision-constant {build.usb_flags} {build.dosfs_flags}
110127
Butterfly-L433CC.build.ldscript=linker_scripts/STM32L433CC_FLASH.ld
111128
Butterfly-L433CC.build.openocdscript=openocd_scripts/stm32l433cc_butterfly.cfg
112129
Butterfly-L433CC.build.variant=STM32L433CC-Butterfly
@@ -120,6 +137,13 @@ Butterfly-L433CC.menu.usb.cdc_msc.build.usb_type=USB_TYPE_CDC_MSC
120137
Butterfly-L433CC.menu.usb.none=No USB
121138
Butterfly-L433CC.menu.usb.none.build.usb_type=USB_TYPE_NONE
122139

140+
Butterfly-L433CC.menu.dosfs.none=None
141+
Butterfly-L433CC.menu.dosfs.none.build.dosfs_sdcard=0
142+
Butterfly-L433CC.menu.dosfs.none.build.dosfs_sflash=0
143+
Butterfly-L433CC.menu.dosfs.sdspi=SDCARD (SPI)
144+
Butterfly-L433CC.menu.dosfs.sdspi.build.dosfs_sdcard=1
145+
Butterfly-L433CC.menu.dosfs.sdspi.build.dosfs_sflash=0
146+
123147
Butterfly-L433CC.menu.speed.80=80 MHz
124148
Butterfly-L433CC.menu.speed.80.build.f_cpu=80000000L
125149
Butterfly-L433CC.menu.speed.72=72 MHz
@@ -182,7 +206,7 @@ Ladybug-L432KC.build.usb_manufacturer=u"\u0324Tlera Corporation"
182206
Ladybug-L432KC.build.usb_product=u"\u0310Ladybug"
183207
Ladybug-L432KC.build.vid=0x1209
184208
Ladybug-L432KC.build.pid=0x6669
185-
Ladybug-L432KC.build.extra_flags=-DSTM32L432xx -D__FPU_PRESENT=1 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -mslow-flash-data -fsingle-precision-constant {build.usb_flags}
209+
Ladybug-L432KC.build.extra_flags=-DSTM32L432xx -D__FPU_PRESENT=1 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -mslow-flash-data -fsingle-precision-constant {build.usb_flags} {build.dosfs_flags}
186210
Ladybug-L432KC.build.ldscript=linker_scripts/STM32L432KC_FLASH.ld
187211
Ladybug-L432KC.build.openocdscript=openocd_scripts/stm32l432kc_ladybug.cfg
188212
Ladybug-L432KC.build.variant=STM32L432KC-Ladybug
@@ -196,6 +220,13 @@ Ladybug-L432KC.menu.usb.cdc_msc.build.usb_type=USB_TYPE_CDC_MSC
196220
Ladybug-L432KC.menu.usb.none=No USB
197221
Ladybug-L432KC.menu.usb.none.build.usb_type=USB_TYPE_NONE
198222

223+
Ladybug-L432KC.menu.dosfs.none=None
224+
Ladybug-L432KC.menu.dosfs.none.build.dosfs_sdcard=0
225+
Ladybug-L432KC.menu.dosfs.none.build.dosfs_sflash=0
226+
Ladybug-L432KC.menu.dosfs.sdspi=SDCARD (SPI)
227+
Ladybug-L432KC.menu.dosfs.sdspi.build.dosfs_sdcard=1
228+
Ladybug-L432KC.menu.dosfs.sdspi.build.dosfs_sflash=0
229+
199230
Ladybug-L432KC.menu.speed.80=80 MHz
200231
Ladybug-L432KC.menu.speed.80.build.f_cpu=80000000L
201232
Ladybug-L432KC.menu.speed.72=72 MHz
@@ -251,7 +282,7 @@ NUCLEO-L432KC.build.f_cpu=80000000L
251282
NUCLEO-L432KC.build.board=NUCLEO-L432KC
252283
NUCLEO-L432KC.build.arch=STM32L4
253284
NUCLEO-L432KC.build.core=stm32l4
254-
NUCLEO-L432KC.build.extra_flags=-DSTM32L432xx -D__FPU_PRESENT=1 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -mslow-flash-data -fsingle-precision-constant
285+
NUCLEO-L432KC.build.extra_flags=-DSTM32L432xx -D__FPU_PRESENT=1 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mabi=aapcs -mslow-flash-data -fsingle-precision-constant {build.dosfs_flags}
255286
NUCLEO-L432KC.build.ldscript=linker_scripts/STM32L432KC_FLASH.ld
256287
NUCLEO-L432KC.build.openocdscript=openocd_scripts/stm32l432kc_nucleo.cfg
257288
NUCLEO-L432KC.build.variant=STM32L432KC-NUCLEO
@@ -320,6 +351,19 @@ NUCLEO-L476RG.build.variant=STM32L476RG-NUCLEO
320351
NUCLEO-L476RG.build.variant_system_libs="-L{runtime.platform.path}/system/STM32L4xx/Lib" "-L{runtime.platform.path}/system/CMSIS/Lib" -lstm32l476 -larm_cortexM4lf_math
321352
NUCLEO-L476RG.build.variant_system_include="-I{runtime.platform.path}/system/CMSIS/Include" "-I{runtime.platform.path}/system/CMSIS/Device/ST/STM32L4xx/Include" "-I{runtime.platform.path}/system/STM32L4xx/Include"
322353

354+
NUCLEO-L476RG.menu.dosfs.none=None
355+
NUCLEO-L476RG.menu.dosfs.none.build.dosfs_sdcard=0
356+
NUCLEO-L476RG.menu.dosfs.none.build.dosfs_sflash=0
357+
NUCLEO-L476RG.menu.dosfs.sdspi=SDCARD (SPI)
358+
NUCLEO-L476RG.menu.dosfs.sdspi.build.dosfs_sdcard=1
359+
NUCLEO-L476RG.menu.dosfs.sdspi.build.dosfs_sflash=0
360+
NUCLEO-L476RG.menu.dosfs.sdmmc=SDCARD (SDIO Default Speed)
361+
NUCLEO-L476RG.menu.dosfs.sdmmc.build.dosfs_sdcard=2
362+
NUCLEO-L476RG.menu.dosfs.sdmmc.build.dosfs_sflash=0
363+
NUCLEO-L476RG.menu.dosfs.sdmmc1=SDCARD (SDIO High Speed)
364+
NUCLEO-L476RG.menu.dosfs.sdmmc1.build.dosfs_sdcard=3
365+
NUCLEO-L476RG.menu.dosfs.sdmmc1.build.dosfs_sflash=0
366+
323367
NUCLEO-L476RG.menu.speed.80=80 MHz
324368
NUCLEO-L476RG.menu.speed.80.build.f_cpu=80000000L
325369
NUCLEO-L476RG.menu.speed.72=72 MHz

cores/stm32l4/FS.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,16 @@ FS::FS() {
177177
}
178178

179179
bool FS::begin()
180+
{
181+
return (f_initvolume() == F_NO_ERROR);
182+
}
183+
184+
void FS::end()
185+
{
186+
f_delvolume();
187+
}
188+
189+
bool FS::check()
180190
{
181191
return (f_checkvolume() == F_NO_ERROR);
182192
}

cores/stm32l4/FS.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,9 @@ class FS
9393
FS();
9494

9595
bool begin();
96+
void end();
9697

98+
bool check();
9799
bool format();
98100
bool info(FSInfo& info);
99101

cores/stm32l4/stm32l4_wiring.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,16 @@ void init( void )
8181
stm32l4_exti_create(&stm32l4_exti, STM32L4_EXTI_IRQ_PRIORITY);
8282
stm32l4_exti_enable(&stm32l4_exti);
8383

84-
#if defined(STM32L4_CONFIG_DOSFS_SDCARD)
85-
f_initvolume(&dosfs_sdcard_init, 0);
86-
f_checkvolume();
87-
#endif /* STM32L4_CONFIG_DOSFS_SDCARD */
88-
#if defined(STM32L4_CONFIG_DOSFS_SFLASH)
89-
f_initvolume(&dosfs_sflash_init, 0);
90-
f_checkvolume();
91-
#endif /* STM32L4_CONFIG_DOSFS_SFLASH */
84+
#if (DOSFS_SDCARD == 1)
85+
stm32l4_sdspi_initialize();
86+
#elif (DOSFS_SDCARD == 2)
87+
stm32l4_sdmmc_initialize(0);
88+
#elif (DOSFS_SDCARD == 3)
89+
stm32l4_sdmmc_initialize(STM32L4_SDMMC_OPTION_HIGH_SPEED);
90+
#endif
91+
#if (DOSFS_SFLASH >= 1)
92+
dosfs_sflash_init();
93+
#endif
9294

9395
/* This is here to work around a linker issue in avr/fdevopen.c */
9496
asm(".global stm32l4_stdio_put");

cores/stm32l4/stm32l4_wiring_private.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ extern "C" {
4949
#include "stm32l4_rtc.h"
5050
#include "stm32l4_sai.h"
5151
#include "stm32l4_flash.h"
52+
#include "stm32l4_sdmmc.h"
53+
#include "stm32l4_sdspi.h"
5254

5355
#define STM32L4_SVCALL_IRQ_PRIORITY 15
5456
#define STM32L4_PENDSV_IRQ_PRIORITY 15
@@ -99,10 +101,10 @@ extern bool USBD_Suspended(void);
99101
* DMA_CHANNEL_DMA2_CH1_SPI3_RX
100102
* DMA_CHANNEL_DMA2_CH2_SPI3_TX
101103
* DMA_CHANNEL_DMA2_CH3_SPI1_RX
102-
* DMA_CHANNEL_DMA2_CH4_SPI1_TX / DMA_CHANNEL_DMA2_CH4_SDMMC
104+
* DMA_CHANNEL_DMA2_CH4_SPI1_TX
103105
* DMA_CHANNEL_DMA2_CH5_UART4_RX
104-
* DMA_CHANNEL_DMA2_CH6_SAI1_A
105-
* DMA_CHANNEL_DMA2_CH7_QUADSPI
106+
* DMA_CHANNEL_DMA2_CH6_SAI1_A (-)
107+
* DMA_CHANNEL_DMA2_CH7_QUADSPI (-)
106108
*
107109
* (SDMMC shares PC10/PC11/PC12 with SPI3, hence is SDMMC is in use,
108110
* then PB3/PB4/PB5 switch from SPI1 to SPI3 to avoid DMA conflicts)

platform.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ compiler.elf2hex.extra_flags=
6868
# ---------
6969
build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}' '-DUSB_TYPE={build.usb_type}'
7070

71+
# DOSFS Flags
72+
# ---------
73+
build.dosfs_flags='-DDOSFS_SDCARD={build.dosfs_sdcard}' '-DDOSFS_SFLASH={build.dosfs_sflash}'
74+
7175
# Compile patterns
7276
# ----------------
7377

system/STM32L4xx/Include/dosfs_api.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,6 @@
121121
#define F_CLUSTER_LAST ((unsigned long)0x0ffffff8)
122122
#define F_CLUSTER_LASTF32R ((unsigned long)0x0fffffff)
123123

124-
typedef struct _dosfs_interface_t F_INTERFACE;
125-
126-
typedef int (*F_DRIVERINIT)(uint32_t param, const F_INTERFACE **p_interface_return, void **p_context_return);
127-
128124
typedef struct _dosfs_file_t F_FILE;
129125

130126
typedef struct {
@@ -169,7 +165,7 @@ typedef struct {
169165
unsigned int bad_high;
170166
} F_SPACE;
171167

172-
extern int f_initvolume(F_DRIVERINIT initfunc, unsigned long param);
168+
extern int f_initvolume(void);
173169
extern int f_delvolume(void);
174170
extern int f_checkvolume(void);
175171
extern int f_format(int fattype);
@@ -212,10 +208,6 @@ extern int f_getc(F_FILE *file);
212208
extern int f_seteof(F_FILE *file);
213209
extern F_FILE *f_truncate(const char *filename, long length);
214210

215-
216-
extern int dosfs_sflash_init(uint32_t param, const F_INTERFACE **p_interface, void **p_context);
217-
extern int dosfs_sdcard_init(uint32_t param, const F_INTERFACE **p_interface, void **p_context);
218-
219211
#ifdef __cplusplus
220212
}
221213
#endif

system/STM32L4xx/Include/dosfs_config.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@
5454

5555
#define DOSFS_CONFIG_SDCARD_HIGH_SPEED 0
5656
#define DOSFS_CONFIG_SDCARD_CRC 1
57-
#define DOSFS_CONFIG_SDCARD_COMMAND_RETRIES 3
58-
#define DOSFS_CONFIG_SDCARD_DATA_RETRIES 3
57+
#define DOSFS_CONFIG_SDCARD_COMMAND_RETRIES 4
58+
#define DOSFS_CONFIG_SDCARD_DATA_RETRIES 4
5959
#define DOSFS_CONFIG_SDCARD_SIMULATE 0
6060
#define DOSFS_CONFIG_SDCARD_SIMULATE_BLKCNT (unsigned long)(65536 * 64)
6161
#define DOSFS_CONFIG_SDCARD_SIMULATE_TRACE 0

system/STM32L4xx/Include/dosfs_core.h

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
#if !defined(_DOSFS_CORE_H)
3030
#define _DOSFS_CORE_H
3131

32-
#include "dosfs_driver.h"
32+
#include "dosfs_device.h"
3333

3434
#ifdef __cplusplus
3535
extern "C" {
@@ -324,7 +324,6 @@ struct _dosfs_cache_entry_t {
324324
#define DOSFS_FILE_MODE_APPEND 0x04
325325
#define DOSFS_FILE_MODE_CREATE 0x08
326326
#define DOSFS_FILE_MODE_TRUNCATE 0x10
327-
#define DOSFS_FILE_MODE_COMMIT 0x20
328327
#define DOSFS_FILE_MODE_SEQUENTIAL 0x40
329328
#define DOSFS_FILE_MODE_RANDOM 0x80
330329

@@ -403,23 +402,10 @@ struct _dosfs_cluster_entry_t {
403402
#endif /* (DOSFS_CONFIG_VOLUME_DIRTY_SUPPORTED == 1) */
404403
#define DOSFS_VOLUME_FLAG_WRITE_PROTECTED 0x0100
405404

406-
#define DOSFS_VOLUME_LOCK_FILE_LOCK 0x0000ffff
407-
#define DOSFS_VOLUME_LOCK_FIND_LOCK 0x00010000
408-
#define DOSFS_VOLUME_LOCK_API_LOCK 0x00020000
409-
#define DOSFS_VOLUME_LOCK_DEVICE_LEASE 0x00400000
410-
#define DOSFS_VOLUME_LOCK_DEVICE_MODIFIED 0x00800000
411-
#define DOSFS_VOLUME_LOCK_WRITE_LOCK 0x01000000
412-
#define DOSFS_VOLUME_LOCK_SCSI_LOCK 0x02000000
413-
#define DOSFS_VOLUME_LOCK_HOST_ACCESSED 0x10000000
414-
#define DOSFS_VOLUME_LOCK_HOST_LEASE 0x20000000
415-
#define DOSFS_VOLUME_LOCK_HOST_MODIFIED 0x40000000
416-
417405
struct _dosfs_volume_t {
418406
uint8_t state;
419407
uint8_t type;
420408
uint16_t flags;
421-
volatile uint32_t lock;
422-
volatile uint32_t lease;
423409
uint32_t product; /* product serial number */
424410
uint32_t serial; /* volume serial number */
425411
uint32_t boot_blkno;
@@ -464,7 +450,8 @@ struct _dosfs_volume_t {
464450

465451
uint32_t cwd_clsno; /* put this first of the work area to align the rest */
466452
#if (DOSFS_CONFIG_SEQUENTIAL_SUPPORTED == 1) || (DOSFS_CONFIG_CONTIGUOUS_SUPPORTED == 1)
467-
uint32_t blk_unit_size; /* size to align a clsno to an AU */
453+
uint32_t au_size;
454+
uint32_t erase_size;
468455
uint32_t start_clsno; /* first valid cluster for sequential/contiguous allocation */
469456
uint32_t end_clsno; /* last valid cluster for sequential/contiguous allocation */
470457
#if (DOSFS_CONFIG_SEQUENTIAL_SUPPORTED == 1)
@@ -533,8 +520,6 @@ struct _dosfs_volume_t {
533520
/* WORK AREA ABOVE */
534521

535522
uint8_t media;
536-
const F_INTERFACE *interface;
537-
void *context;
538523
dosfs_file_t file_table[DOSFS_CONFIG_MAX_FILES];
539524

540525
#if (DOSFS_CONFIG_STATISTICS == 1)
@@ -594,10 +579,11 @@ extern dosfs_volume_t dosfs_volume;
594579
#define DOSFS_INDEX_TO_BLKOFS(_index) (((_index) << DOSFS_DIR_SHIFT) & DOSFS_BLK_MASK)
595580

596581

597-
#define DOSFS_DEFAULT_VOLUME() (&dosfs_volume)
598-
#define DOSFS_PATH_VOLUME(_path) (&dosfs_volume)
599-
#define DOSFS_FIND_VOLUME(_find) (&dosfs_volume)
600-
#define DOSFS_FILE_VOLUME(_file) (&dosfs_volume)
582+
#define DOSFS_DEFAULT_VOLUME() (&dosfs_volume)
583+
#define DOSFS_PATH_VOLUME(_path) (&dosfs_volume)
584+
#define DOSFS_FIND_VOLUME(_find) (&dosfs_volume)
585+
#define DOSFS_FILE_VOLUME(_file) (&dosfs_volume)
586+
#define DOSFS_VOLUME_DEVICE(_volume) (&dosfs_device)
601587

602588
#if (DOSFS_CONFIG_STATISTICS == 1)
603589

system/STM32L4xx/Include/dosfs_driver.h renamed to system/STM32L4xx/Include/dosfs_device.h

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2014 Thomas Roell. All rights reserved.
2+
* Copyright (c) 2014-2017 Thomas Roell. All rights reserved.
33
*
44
* Permission is hereby granted, free of charge, to any person obtaining a copy
55
* of this software and associated documentation files (the "Software"), to
@@ -26,8 +26,8 @@
2626
* WITH THE SOFTWARE.
2727
*/
2828

29-
#if !defined(_DOSFS_DRIVER_H)
30-
#define _DOSFS_DRIVER_H
29+
#if !defined(_DOSFS_DEVICE_H)
30+
#define _DOSFS_DEVICE_H
3131

3232
#include <stdbool.h>
3333
#include <stdint.h>
@@ -39,7 +39,7 @@
3939
extern "C" {
4040
#endif
4141

42-
typedef struct _dosfs_driver_t dosfs_driver_t;
42+
typedef struct _dosfs_device_t dosfs_device_t;
4343

4444
#define DOSFS_BLK_SIZE 512
4545
#define DOSFS_BLK_MASK 511
@@ -50,19 +50,38 @@ typedef struct _dosfs_driver_t dosfs_driver_t;
5050
#define DOSFS_MEDIA_SDSC 2
5151
#define DOSFS_MEDIA_SDHC 3
5252

53-
typedef struct _dosfs_interface_t {
53+
typedef struct _dosfs_device_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);
5757
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, 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);
62-
} dosfs_interface_t;
59+
int (*read)(void *context, uint32_t address, uint8_t *data, uint32_t length, bool prefetch);
60+
int (*write)(void *context, uint32_t address, const uint8_t *data, uint32_t length, volatile uint8_t *p_status);
61+
int (*sync)(void *context, bool wait);
62+
} dosfs_device_interface_t;
63+
64+
#define DOSFS_DEVICE_LOCK_INIT 0x00000001 /* device lock during init */
65+
#define DOSFS_DEVICE_LOCK_SFLASH 0x00000002 /* SFLASH interface lock */
66+
#define DOSFS_DEVICE_LOCK_VOLUME 0x00000004 /* DOSFS file system lock */
67+
#define DOSFS_DEVICE_LOCK_SCSI 0x00000008 /* USB/MSC SCSI opereration */
68+
#define DOSFS_DEVICE_LOCK_MEDIUM 0x00000010 /* USB/MSC ALLOW_PREVENT_MEDIUM_REMOVAL lock */
69+
#define DOSFS_DEVICE_LOCK_EJECTED 0x00000020 /* USB/MSC ejected (refuse to remount */
70+
#define DOSFS_DEVICE_LOCK_ACCESSED 0x40000000 /* USB/MSC accessed device */
71+
#define DOSFS_DEVICE_LOCK_MODIFIED 0x80000000 /* DOSFS modified device */
72+
73+
struct _dosfs_device_t {
74+
volatile uint32_t lock;
75+
const dosfs_device_interface_t *interface;
76+
void *context;
77+
};
78+
79+
extern dosfs_device_t dosfs_device;
80+
81+
extern int dosfs_device_format(dosfs_device_t *device, uint8_t *data);
6382

6483
#ifdef __cplusplus
6584
}
6685
#endif
6786

68-
#endif /*_DOSFS_DRIVER_H */
87+
#endif /*_DOSFS_DEVICE_H */

0 commit comments

Comments
 (0)