Preparation for MMC_SPI support, not finished.
@@ -0,0 +1,304 @@ | ||
1 | +/* CHIBIOS FIX */ | |
2 | +#include "ch.h" | |
3 | +#define FATFS_CHIBIOS_EXTENSIONS | |
4 | + | |
5 | +/*---------------------------------------------------------------------------/ | |
6 | +/ FatFs Functional Configurations | |
7 | +/---------------------------------------------------------------------------*/ | |
8 | + | |
9 | +#define FFCONF_DEF 86631 /* Revision ID */ | |
10 | + | |
11 | +/*---------------------------------------------------------------------------/ | |
12 | +/ Function Configurations | |
13 | +/---------------------------------------------------------------------------*/ | |
14 | + | |
15 | +#define FF_FS_READONLY 0 | |
16 | +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) | |
17 | +/ Read-only configuration removes writing API functions, f_write(), f_sync(), | |
18 | +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() | |
19 | +/ and optional writing functions as well. */ | |
20 | + | |
21 | + | |
22 | +#define FF_FS_MINIMIZE 0 | |
23 | +/* This option defines minimization level to remove some basic API functions. | |
24 | +/ | |
25 | +/ 0: Basic functions are fully enabled. | |
26 | +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() | |
27 | +/ are removed. | |
28 | +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. | |
29 | +/ 3: f_lseek() function is removed in addition to 2. */ | |
30 | + | |
31 | + | |
32 | +#define FF_USE_FIND 0 | |
33 | +/* This option switches filtered directory read functions, f_findfirst() and | |
34 | +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ | |
35 | + | |
36 | + | |
37 | +#define FF_USE_MKFS 0 | |
38 | +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ | |
39 | + | |
40 | + | |
41 | +#define FF_USE_FASTSEEK 0 | |
42 | +/* This option switches fast seek function. (0:Disable or 1:Enable) */ | |
43 | + | |
44 | + | |
45 | +#define FF_USE_EXPAND 0 | |
46 | +/* This option switches f_expand function. (0:Disable or 1:Enable) */ | |
47 | + | |
48 | + | |
49 | +#define FF_USE_CHMOD 0 | |
50 | +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). | |
51 | +/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */ | |
52 | + | |
53 | + | |
54 | +#define FF_USE_LABEL 0 | |
55 | +/* This option switches volume label functions, f_getlabel() and f_setlabel(). | |
56 | +/ (0:Disable or 1:Enable) */ | |
57 | + | |
58 | + | |
59 | +#define FF_USE_FORWARD 0 | |
60 | +/* This option switches f_forward() function. (0:Disable or 1:Enable) */ | |
61 | + | |
62 | + | |
63 | +#define FF_USE_STRFUNC 0 | |
64 | +#define FF_PRINT_LLI 0 | |
65 | +#define FF_PRINT_FLOAT 0 | |
66 | +#define FF_STRF_ENCODE 0 | |
67 | +/* FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() and | |
68 | +/ f_printf(). | |
69 | +/ | |
70 | +/ 0: Disable. FF_PRINT_LLI, FF_PRINT_FLOAT and FF_STRF_ENCODE have no effect. | |
71 | +/ 1: Enable without LF-CRLF conversion. | |
72 | +/ 2: Enable with LF-CRLF conversion. | |
73 | +/ | |
74 | +/ FF_PRINT_LLI = 1 makes f_printf() support long long argument and FF_PRINT_FLOAT = 1/2 | |
75 | + makes f_printf() support floating point argument. These features want C99 or later. | |
76 | +/ When FF_LFN_UNICODE >= 1 with LFN enabled, string functions convert the character | |
77 | +/ encoding in it. FF_STRF_ENCODE selects assumption of character encoding ON THE FILE | |
78 | +/ to be read/written via those functions. | |
79 | +/ | |
80 | +/ 0: ANSI/OEM in current CP | |
81 | +/ 1: Unicode in UTF-16LE | |
82 | +/ 2: Unicode in UTF-16BE | |
83 | +/ 3: Unicode in UTF-8 | |
84 | +*/ | |
85 | + | |
86 | + | |
87 | +/*---------------------------------------------------------------------------/ | |
88 | +/ Locale and Namespace Configurations | |
89 | +/---------------------------------------------------------------------------*/ | |
90 | + | |
91 | +#define FF_CODE_PAGE 850 | |
92 | +/* This option specifies the OEM code page to be used on the target system. | |
93 | +/ Incorrect code page setting can cause a file open failure. | |
94 | +/ | |
95 | +/ 437 - U.S. | |
96 | +/ 720 - Arabic | |
97 | +/ 737 - Greek | |
98 | +/ 771 - KBL | |
99 | +/ 775 - Baltic | |
100 | +/ 850 - Latin 1 | |
101 | +/ 852 - Latin 2 | |
102 | +/ 855 - Cyrillic | |
103 | +/ 857 - Turkish | |
104 | +/ 860 - Portuguese | |
105 | +/ 861 - Icelandic | |
106 | +/ 862 - Hebrew | |
107 | +/ 863 - Canadian French | |
108 | +/ 864 - Arabic | |
109 | +/ 865 - Nordic | |
110 | +/ 866 - Russian | |
111 | +/ 869 - Greek 2 | |
112 | +/ 932 - Japanese (DBCS) | |
113 | +/ 936 - Simplified Chinese (DBCS) | |
114 | +/ 949 - Korean (DBCS) | |
115 | +/ 950 - Traditional Chinese (DBCS) | |
116 | +/ 0 - Include all code pages above and configured by f_setcp() | |
117 | +*/ | |
118 | + | |
119 | + | |
120 | +#define FF_USE_LFN 3 | |
121 | +#define FF_MAX_LFN 255 | |
122 | +/* The FF_USE_LFN switches the support for LFN (long file name). | |
123 | +/ | |
124 | +/ 0: Disable LFN. FF_MAX_LFN has no effect. | |
125 | +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. | |
126 | +/ 2: Enable LFN with dynamic working buffer on the STACK. | |
127 | +/ 3: Enable LFN with dynamic working buffer on the HEAP. | |
128 | +/ | |
129 | +/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function | |
130 | +/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and | |
131 | +/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled. | |
132 | +/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can | |
133 | +/ be in range of 12 to 255. It is recommended to be set it 255 to fully support LFN | |
134 | +/ specification. | |
135 | +/ When use stack for the working buffer, take care on stack overflow. When use heap | |
136 | +/ memory for the working buffer, memory management functions, ff_memalloc() and | |
137 | +/ ff_memfree() exemplified in ffsystem.c, need to be added to the project. */ | |
138 | + | |
139 | + | |
140 | +#define FF_LFN_UNICODE 0 | |
141 | +/* This option switches the character encoding on the API when LFN is enabled. | |
142 | +/ | |
143 | +/ 0: ANSI/OEM in current CP (TCHAR = char) | |
144 | +/ 1: Unicode in UTF-16 (TCHAR = WCHAR) | |
145 | +/ 2: Unicode in UTF-8 (TCHAR = char) | |
146 | +/ 3: Unicode in UTF-32 (TCHAR = DWORD) | |
147 | +/ | |
148 | +/ Also behavior of string I/O functions will be affected by this option. | |
149 | +/ When LFN is not enabled, this option has no effect. */ | |
150 | + | |
151 | + | |
152 | +#define FF_LFN_BUF 255 | |
153 | +#define FF_SFN_BUF 12 | |
154 | +/* This set of options defines size of file name members in the FILINFO structure | |
155 | +/ which is used to read out directory items. These values should be suffcient for | |
156 | +/ the file names to read. The maximum possible length of the read file name depends | |
157 | +/ on character encoding. When LFN is not enabled, these options have no effect. */ | |
158 | + | |
159 | + | |
160 | +#define FF_FS_RPATH 0 | |
161 | +/* This option configures support for relative path. | |
162 | +/ | |
163 | +/ 0: Disable relative path and remove related functions. | |
164 | +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. | |
165 | +/ 2: f_getcwd() function is available in addition to 1. | |
166 | +*/ | |
167 | + | |
168 | + | |
169 | +/*---------------------------------------------------------------------------/ | |
170 | +/ Drive/Volume Configurations | |
171 | +/---------------------------------------------------------------------------*/ | |
172 | + | |
173 | +#define FF_VOLUMES 1 | |
174 | +/* Number of volumes (logical drives) to be used. (1-10) */ | |
175 | + | |
176 | + | |
177 | +#define FF_STR_VOLUME_ID 0 | |
178 | +#define FF_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3" | |
179 | +/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings. | |
180 | +/ When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive | |
181 | +/ number in the path name. FF_VOLUME_STRS defines the volume ID strings for each | |
182 | +/ logical drives. Number of items must not be less than FF_VOLUMES. Valid | |
183 | +/ characters for the volume ID strings are A-Z, a-z and 0-9, however, they are | |
184 | +/ compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is | |
185 | +/ not defined, a user defined volume string table needs to be defined as: | |
186 | +/ | |
187 | +/ const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",... | |
188 | +*/ | |
189 | + | |
190 | + | |
191 | +#define FF_MULTI_PARTITION 0 | |
192 | +/* This option switches support for multiple volumes on the physical drive. | |
193 | +/ By default (0), each logical drive number is bound to the same physical drive | |
194 | +/ number and only an FAT volume found on the physical drive will be mounted. | |
195 | +/ When this function is enabled (1), each logical drive number can be bound to | |
196 | +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() | |
197 | +/ funciton will be available. */ | |
198 | + | |
199 | + | |
200 | +#define FF_MIN_SS 512 | |
201 | +#define FF_MAX_SS 512 | |
202 | +/* This set of options configures the range of sector size to be supported. (512, | |
203 | +/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and | |
204 | +/ harddisk, but a larger value may be required for on-board flash memory and some | |
205 | +/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured | |
206 | +/ for variable sector size mode and disk_ioctl() function needs to implement | |
207 | +/ GET_SECTOR_SIZE command. */ | |
208 | + | |
209 | + | |
210 | +#define FF_LBA64 0 | |
211 | +/* This option switches support for 64-bit LBA. (0:Disable or 1:Enable) | |
212 | +/ To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) */ | |
213 | + | |
214 | + | |
215 | +#define FF_MIN_GPT 0x10000000 | |
216 | +/* Minimum number of sectors to switch GPT as partitioning format in f_mkfs and | |
217 | +/ f_fdisk function. 0x100000000 max. This option has no effect when FF_LBA64 == 0. */ | |
218 | + | |
219 | + | |
220 | +#define FF_USE_TRIM 0 | |
221 | +/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable) | |
222 | +/ To enable Trim function, also CTRL_TRIM command should be implemented to the | |
223 | +/ disk_ioctl() function. */ | |
224 | + | |
225 | + | |
226 | + | |
227 | +/*---------------------------------------------------------------------------/ | |
228 | +/ System Configurations | |
229 | +/---------------------------------------------------------------------------*/ | |
230 | + | |
231 | +#define FF_FS_TINY 0 | |
232 | +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) | |
233 | +/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. | |
234 | +/ Instead of private sector buffer eliminated from the file object, common sector | |
235 | +/ buffer in the filesystem object (FATFS) is used for the file data transfer. */ | |
236 | + | |
237 | + | |
238 | +#define FF_FS_EXFAT 1 | |
239 | +/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) | |
240 | +/ To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) | |
241 | +/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ | |
242 | + | |
243 | + | |
244 | +#define FF_FS_NORTC 0 | |
245 | +#define FF_NORTC_MON 1 | |
246 | +#define FF_NORTC_MDAY 1 | |
247 | +#define FF_NORTC_YEAR 2020 | |
248 | +/* The option FF_FS_NORTC switches timestamp functiton. If the system does not have | |
249 | +/ any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable | |
250 | +/ the timestamp function. Every object modified by FatFs will have a fixed timestamp | |
251 | +/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time. | |
252 | +/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be | |
253 | +/ added to the project to read current time form real-time clock. FF_NORTC_MON, | |
254 | +/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. | |
255 | +/ These options have no effect in read-only configuration (FF_FS_READONLY = 1). */ | |
256 | + | |
257 | + | |
258 | +#define FF_FS_NOFSINFO 0 | |
259 | +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this | |
260 | +/ option, and f_getfree() function at first time after volume mount will force | |
261 | +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. | |
262 | +/ | |
263 | +/ bit0=0: Use free cluster count in the FSINFO if available. | |
264 | +/ bit0=1: Do not trust free cluster count in the FSINFO. | |
265 | +/ bit1=0: Use last allocated cluster number in the FSINFO if available. | |
266 | +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. | |
267 | +*/ | |
268 | + | |
269 | + | |
270 | +#define FF_FS_LOCK 0 | |
271 | +/* The option FF_FS_LOCK switches file lock function to control duplicated file open | |
272 | +/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY | |
273 | +/ is 1. | |
274 | +/ | |
275 | +/ 0: Disable file lock function. To avoid volume corruption, application program | |
276 | +/ should avoid illegal open, remove and rename to the open objects. | |
277 | +/ >0: Enable file lock function. The value defines how many files/sub-directories | |
278 | +/ can be opened simultaneously under file lock control. Note that the file | |
279 | +/ lock control is independent of re-entrancy. */ | |
280 | + | |
281 | + | |
282 | +#define FF_FS_REENTRANT 0 | |
283 | +#define FF_FS_TIMEOUT TIME_MS2I(1000) | |
284 | +#define FF_SYNC_t semaphore_t* | |
285 | +/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs | |
286 | +/ module itself. Note that regardless of this option, file access to different | |
287 | +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() | |
288 | +/ and f_fdisk() function, are always not re-entrant. Only file/directory access | |
289 | +/ to the same volume is under control of this function. | |
290 | +/ | |
291 | +/ 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect. | |
292 | +/ 1: Enable re-entrancy. Also user provided synchronization handlers, | |
293 | +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() | |
294 | +/ function, must be added to the project. Samples are available in | |
295 | +/ option/syscall.c. | |
296 | +/ | |
297 | +/ The FF_FS_TIMEOUT defines timeout period in unit of time tick. | |
298 | +/ The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, | |
299 | +/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be | |
300 | +/ included somewhere in the scope of ff.h. */ | |
301 | + | |
302 | + | |
303 | + | |
304 | +/*--- End of configuration options ---*/ |
@@ -114,7 +114,7 @@ | ||
114 | 114 | * @brief Enables the MMC_SPI subsystem. |
115 | 115 | */ |
116 | 116 | #if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) |
117 | -#define HAL_USE_MMC_SPI FALSE | |
117 | +#define HAL_USE_MMC_SPI TRUE | |
118 | 118 | #endif |
119 | 119 | |
120 | 120 | /** |
@@ -163,7 +163,7 @@ | ||
163 | 163 | * @brief Enables the SPI subsystem. |
164 | 164 | */ |
165 | 165 | #if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) |
166 | -#define HAL_USE_SPI FALSE | |
166 | +#define HAL_USE_SPI TRUE | |
167 | 167 | #endif |
168 | 168 | |
169 | 169 | /** |
@@ -325,7 +325,7 @@ | ||
325 | 325 | * SPI driver system settings. |
326 | 326 | */ |
327 | 327 | #define STM32_SPI_USE_SPI1 FALSE |
328 | -#define STM32_SPI_USE_SPI2 FALSE | |
328 | +#define STM32_SPI_USE_SPI2 TRUE | |
329 | 329 | #define STM32_SPI_USE_SPI3 FALSE |
330 | 330 | #define STM32_SPI_USE_SPI4 FALSE |
331 | 331 | #define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY |
@@ -50,8 +50,52 @@ | ||
50 | 50 | /* Module exported functions. */ |
51 | 51 | /*===========================================================================*/ |
52 | 52 | |
53 | +void spi_error_cb(SPIDriver *spip); | |
54 | + | |
55 | +/* | |
56 | + * High speed SPI configuration (21.25MHz, CPHA=0, CPOL=0, MSb first). | |
57 | + */ | |
58 | +const SPIConfig hs_spicfg = { | |
59 | + .circular = false, | |
60 | + .slave = false, | |
61 | + .data_cb = NULL, | |
62 | + .error_cb = spi_error_cb, | |
63 | + .ssport = GPIOB, | |
64 | + .sspad = 12U, | |
65 | + .cr1 = SPI_CR1_BR_0, | |
66 | + .cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 | |
67 | +}; | |
68 | + | |
69 | +/* | |
70 | + * Low speed SPI configuration (664,062kHz, CPHA=0, CPOL=0, MSb first). | |
71 | + */ | |
72 | +const SPIConfig ls_spicfg = { | |
73 | + .circular = false, | |
74 | + .slave = false, | |
75 | + .data_cb = NULL, | |
76 | + .error_cb = spi_error_cb, | |
77 | + .ssport = GPIOB, | |
78 | + .sspad = 12U, | |
79 | + .cr1 = SPI_CR1_BR_2 | SPI_CR1_BR_1, | |
80 | + .cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 | |
81 | +}; | |
82 | + | |
53 | 83 | void portab_setup(void) { |
54 | 84 | |
85 | + /* | |
86 | + * SPI2 I/O pins setup. | |
87 | + */ | |
88 | + palSetPad(GPIOB, 12); | |
89 | + palSetPadMode(GPIOB, 11, PAL_MODE_INPUT_PULLUP | | |
90 | + PAL_STM32_OSPEED_HIGHEST); /* Card Detect. */ | |
91 | + palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | | |
92 | + PAL_STM32_OSPEED_HIGHEST); /* SPI2 CS. */ | |
93 | + palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | | |
94 | + PAL_STM32_OSPEED_HIGHEST); /* SPI2 SCK. */ | |
95 | + palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5) | | |
96 | + PAL_STM32_OSPEED_HIGHEST); /* SPI2 MISO. */ | |
97 | + palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | | |
98 | + PAL_STM32_OSPEED_HIGHEST); /* SPI2 MOSI. */ | |
55 | 99 | } |
56 | 100 | |
57 | 101 | /** @} */ |
@@ -83,7 +83,7 @@ | ||
83 | 83 | * @brief Enables the VFS FatFS Driver. |
84 | 84 | */ |
85 | 85 | #if !defined(VFS_CFG_ENABLE_DRV_FATFS) || defined(__DOXYGEN__) |
86 | -#define VFS_CFG_ENABLE_DRV_FATFS FALSE | |
86 | +#define VFS_CFG_ENABLE_DRV_FATFS TRUE | |
87 | 87 | #endif |
88 | 88 | |
89 | 89 | /** @} */ |
@@ -151,6 +151,10 @@ | ||
151 | 151 | /* Main and generic code. */ |
152 | 152 | /*===========================================================================*/ |
153 | 153 | |
154 | +#if !HAL_USE_SDC | |
155 | +mmc_spi_driver_t MMCD1; | |
156 | +#endif | |
157 | + | |
154 | 158 | /* |
155 | 159 | * Pointer to the shell thread, if active, else NULL. |
156 | 160 | */ |
@@ -181,9 +185,9 @@ | ||
181 | 185 | #if HAL_USE_SDC |
182 | 186 | sdcDisconnect(&PORTAB_SDCD1); |
183 | 187 | #else |
184 | - if (mmcDisconnect(&MMCD1)) { | |
188 | + mmcDisconnect(&MMCD1); | |
185 | 189 | #endif |
186 | - return; | |
190 | + return; | |
187 | 191 | } |
188 | 192 | fs_ready = true; |
189 | 193 | #endif |
@@ -267,12 +271,19 @@ | ||
267 | 271 | nullObjectInit(&nullstream); |
268 | 272 | |
269 | 273 | #if VFS_CFG_ENABLE_DRV_FATFS == TRUE |
274 | +#if HAL_USE_SDC | |
270 | 275 | /* Activates the SDC driver using default configuration.*/ |
271 | 276 | sdcStart(&PORTAB_SDCD1, NULL); |
272 | 277 | |
273 | 278 | /* Activates the card insertion monitor.*/ |
274 | 279 | tmr_init(&PORTAB_SDCD1); |
280 | +#else | |
281 | + /* TODO MMC_SPI */ | |
275 | 282 | |
283 | + /* Activates the card insertion monitor.*/ | |
284 | + tmr_init(&MMCD1); | |
285 | +#endif | |
286 | + | |
276 | 287 | /* Initializing an overlay VFS object overlaying a FatFS driver. Note |
277 | 288 | that this virtual file system can only access the "/sb1" sub-directory |
278 | 289 | on the physical FatFS volume.*/ |