Firmware, Bootloader: add f3 target. (#215)
* Firmware, Bootloader: add f3 target. Refactor code to be portable across targets. * Firmware: remove bkpt * Makefile: debug agent. Debug: f3 platform throw openocd. * freertos-openocd helper * separate hal resources * return of input_dump app * using hew target resources abstration layer for backlight and blink * dirty hack for input driver, f3 has no charging pin * worked input interrupts * working display * F3: switch to 32mHz resonator * F3: configure SD_CS pin * NFC: port to F3. * fat uart app * sd card hal api * separate CC1101 spi config * faster spi gpio for sd card * Assets: disable LFS * Cube: disable css on LSE * Input: format code * Make: add bootloader source code to formatting rule * F3: enable rf by default, adjust clock settings, map all pins where they should be. * libs for coreglitch_demo_0 * nvic priority * bus clocks all to 64 * lf-rfid timer and pin * irda * ir rx setup * tim2 irq handler * Makefile: environment aware mkdir * Makefile, Irukagotchi: commit seq number. * split falling and rising ir rx events * Makefile: proper git branch detect on old git. Firmware: api fix. * fix irda * Makefile,Irukagotchi: date timestamp. * NFC: adjust SPI speed * Irukagotchi: format code * Make: add blackmagic debug in host mode * Makefile: detach blackmagic from terminal signals * Makefile,Irukagotchi: stamp target * add F3 bootloader/firmware to CI Co-authored-by: Aleksandr Kutuzov <aku@plooks.com> Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com> Co-authored-by: aanper <mail@s3f.ru>
This commit is contained in:
		
							
								
								
									
										56
									
								
								firmware/targets/f3/Src/fatfs/fatfs.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								firmware/targets/f3/Src/fatfs/fatfs.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file   fatfs.c | ||||
|   * @brief  Code for fatfs applications | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| #include "fatfs.h" | ||||
|  | ||||
| uint8_t retUSER;    /* Return value for USER */ | ||||
| char USERPath[4];   /* USER logical drive path */ | ||||
| FATFS USERFatFS;    /* File system object for USER logical drive */ | ||||
| FIL USERFile;       /* File object for USER */ | ||||
|  | ||||
| /* USER CODE BEGIN Variables */ | ||||
|  | ||||
| /* USER CODE END Variables */     | ||||
|  | ||||
| void MX_FATFS_Init(void)  | ||||
| { | ||||
|   /*## FatFS: Link the USER driver ###########################*/ | ||||
|   retUSER = FATFS_LinkDriver(&USER_Driver, USERPath); | ||||
|  | ||||
|   /* USER CODE BEGIN Init */ | ||||
|   /* additional user code for init */      | ||||
|   /* USER CODE END Init */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Gets Time from RTC  | ||||
|   * @param  None | ||||
|   * @retval Time in DWORD | ||||
|   */ | ||||
| DWORD get_fattime(void) | ||||
| { | ||||
|   /* USER CODE BEGIN get_fattime */ | ||||
|   return 0; | ||||
|   /* USER CODE END get_fattime */   | ||||
| } | ||||
|  | ||||
| /* USER CODE BEGIN Application */ | ||||
|       | ||||
| /* USER CODE END Application */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										49
									
								
								firmware/targets/f3/Src/fatfs/fatfs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								firmware/targets/f3/Src/fatfs/fatfs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file   fatfs.h | ||||
|   * @brief  Header for fatfs applications | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __fatfs_H | ||||
| #define __fatfs_H | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #include "fatfs/ff.h" | ||||
| #include "fatfs/ff_gen_drv.h" | ||||
| #include "user_diskio.h" /* defines USER_Driver as external */ | ||||
|  | ||||
| /* USER CODE BEGIN Includes */ | ||||
|  | ||||
| /* USER CODE END Includes */ | ||||
|  | ||||
| extern uint8_t retUSER; /* Return value for USER */ | ||||
| extern char USERPath[4]; /* USER logical drive path */ | ||||
| extern FATFS USERFatFS; /* File system object for USER logical drive */ | ||||
| extern FIL USERFile; /* File object for USER */ | ||||
|  | ||||
| void MX_FATFS_Init(void); | ||||
|  | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
|  | ||||
| /* USER CODE END Prototypes */ | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif /*__fatfs_H */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										270
									
								
								firmware/targets/f3/Src/fatfs/ffconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								firmware/targets/f3/Src/fatfs/ffconf.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,270 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   *  FatFs - Generic FAT file system module  R0.12c (C)ChaN, 2017 | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
|  | ||||
| #ifndef _FFCONF | ||||
| #define _FFCONF 68300	/* Revision ID */ | ||||
|  | ||||
| /*-----------------------------------------------------------------------------/ | ||||
| / Additional user header to be used   | ||||
| /-----------------------------------------------------------------------------*/ | ||||
|  | ||||
| #include "main.h" | ||||
| #include "stm32wbxx_hal.h" | ||||
| #include "cmsis_os.h" /* _FS_REENTRANT set to 1 and CMSIS API chosen */ | ||||
|  | ||||
| /*-----------------------------------------------------------------------------/ | ||||
| / Function Configurations | ||||
| /-----------------------------------------------------------------------------*/ | ||||
|  | ||||
| #define _FS_READONLY         0      /* 0:Read/Write or 1:Read only */ | ||||
| /* This option switches read-only configuration. (0:Read/Write or 1:Read-only) | ||||
| /  Read-only configuration removes writing API functions, f_write(), f_sync(), | ||||
| /  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() | ||||
| /  and optional writing functions as well. */ | ||||
|  | ||||
| #define _FS_MINIMIZE         0      /* 0 to 3 */ | ||||
| /* This option defines minimization level to remove some basic API functions. | ||||
| / | ||||
| /   0: All basic functions are enabled. | ||||
| /   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() | ||||
| /      are removed. | ||||
| /   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. | ||||
| /   3: f_lseek() function is removed in addition to 2. */ | ||||
|  | ||||
| #define _USE_STRFUNC         2      /* 0:Disable or 1-2:Enable */ | ||||
| /* This option switches string functions, f_gets(), f_putc(), f_puts() and | ||||
| /  f_printf(). | ||||
| / | ||||
| /  0: Disable string functions. | ||||
| /  1: Enable without LF-CRLF conversion. | ||||
| /  2: Enable with LF-CRLF conversion. */ | ||||
|  | ||||
| #define _USE_FIND            0 | ||||
| /* This option switches filtered directory read functions, f_findfirst() and | ||||
| /  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ | ||||
|  | ||||
| #define _USE_MKFS            1 | ||||
| /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ | ||||
|  | ||||
| #define _USE_FASTSEEK        1 | ||||
| /* This option switches fast seek feature. (0:Disable or 1:Enable) */ | ||||
|  | ||||
| #define	_USE_EXPAND		0 | ||||
| /* This option switches f_expand function. (0:Disable or 1:Enable) */ | ||||
|  | ||||
| #define _USE_CHMOD		0 | ||||
| /* This option switches attribute manipulation functions, f_chmod() and f_utime(). | ||||
| /  (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */ | ||||
|  | ||||
| #define _USE_LABEL           0 | ||||
| /* This option switches volume label functions, f_getlabel() and f_setlabel(). | ||||
| /  (0:Disable or 1:Enable) */ | ||||
|  | ||||
| #define _USE_FORWARD         0 | ||||
| /* This option switches f_forward() function. (0:Disable or 1:Enable) */ | ||||
|  | ||||
| /*-----------------------------------------------------------------------------/ | ||||
| / Locale and Namespace Configurations | ||||
| /-----------------------------------------------------------------------------*/ | ||||
|  | ||||
| #define _CODE_PAGE         850 | ||||
| /* This option specifies the OEM code page to be used on the target system. | ||||
| /  Incorrect setting of the code page can cause a file open failure. | ||||
| / | ||||
| /   1   - ASCII (No extended character. Non-LFN cfg. only) | ||||
| /   437 - U.S. | ||||
| /   720 - Arabic | ||||
| /   737 - Greek | ||||
| /   771 - KBL | ||||
| /   775 - Baltic | ||||
| /   850 - Latin 1 | ||||
| /   852 - Latin 2 | ||||
| /   855 - Cyrillic | ||||
| /   857 - Turkish | ||||
| /   860 - Portuguese | ||||
| /   861 - Icelandic | ||||
| /   862 - Hebrew | ||||
| /   863 - Canadian French | ||||
| /   864 - Arabic | ||||
| /   865 - Nordic | ||||
| /   866 - Russian | ||||
| /   869 - Greek 2 | ||||
| /   932 - Japanese (DBCS) | ||||
| /   936 - Simplified Chinese (DBCS) | ||||
| /   949 - Korean (DBCS) | ||||
| /   950 - Traditional Chinese (DBCS) | ||||
| */ | ||||
|  | ||||
| #define _USE_LFN     2    /* 0 to 3 */ | ||||
| #define _MAX_LFN     255  /* Maximum LFN length to handle (12 to 255) */ | ||||
| /* The _USE_LFN switches the support of long file name (LFN). | ||||
| / | ||||
| /   0: Disable support of LFN. _MAX_LFN has no effect. | ||||
| /   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. | ||||
| /   2: Enable LFN with dynamic working buffer on the STACK. | ||||
| /   3: Enable LFN with dynamic working buffer on the HEAP. | ||||
| / | ||||
| /  To enable the LFN, Unicode handling functions (option/unicode.c) must be added | ||||
| /  to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and | ||||
| /  additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255. | ||||
| /  It should be set 255 to support full featured LFN operations. | ||||
| /  When use stack for the working buffer, take care on stack overflow. When use heap | ||||
| /  memory for the working buffer, memory management functions, ff_memalloc() and | ||||
| /  ff_memfree(), must be added to the project. */ | ||||
|  | ||||
| #define _LFN_UNICODE    0 /* 0:ANSI/OEM or 1:Unicode */ | ||||
| /* This option switches character encoding on the API. (0:ANSI/OEM or 1:UTF-16) | ||||
| /  To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1. | ||||
| /  This option also affects behavior of string I/O functions. */ | ||||
|  | ||||
| #define _STRF_ENCODE    3 | ||||
| /* When _LFN_UNICODE == 1, this option selects the character encoding ON THE FILE to | ||||
| /  be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). | ||||
| / | ||||
| /  0: ANSI/OEM | ||||
| /  1: UTF-16LE | ||||
| /  2: UTF-16BE | ||||
| /  3: UTF-8 | ||||
| / | ||||
| /  This option has no effect when _LFN_UNICODE == 0. */ | ||||
|  | ||||
| #define _FS_RPATH       0 /* 0 to 2 */ | ||||
| /* This option configures support of relative path. | ||||
| / | ||||
| /   0: Disable relative path and remove related functions. | ||||
| /   1: Enable relative path. f_chdir() and f_chdrive() are available. | ||||
| /   2: f_getcwd() function is available in addition to 1. | ||||
| */ | ||||
|  | ||||
| /*---------------------------------------------------------------------------/ | ||||
| / Drive/Volume Configurations | ||||
| /----------------------------------------------------------------------------*/ | ||||
|  | ||||
| #define _VOLUMES    1 | ||||
| /* Number of volumes (logical drives) to be used. */ | ||||
|  | ||||
| /* USER CODE BEGIN Volumes */   | ||||
| #define _STR_VOLUME_ID          0	/* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */ | ||||
| #define _VOLUME_STRS            "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" | ||||
| /* _STR_VOLUME_ID switches string support of volume ID. | ||||
| /  When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive | ||||
| /  number in the path name. _VOLUME_STRS defines the drive ID strings for each | ||||
| /  logical drives. Number of items must be equal to _VOLUMES. Valid characters for | ||||
| /  the drive ID strings are: A-Z and 0-9. */ | ||||
| /* USER CODE END Volumes */   | ||||
|  | ||||
| #define _MULTI_PARTITION     0 /* 0:Single partition, 1:Multiple partition */ | ||||
| /* This option switches support of multi-partition on a physical drive. | ||||
| /  By default (0), each logical drive number is bound to the same physical drive | ||||
| /  number and only an FAT volume found on the physical drive will be mounted. | ||||
| /  When multi-partition is enabled (1), each logical drive number can be bound to | ||||
| /  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() | ||||
| /  funciton will be available. */ | ||||
| #define _MIN_SS    512  /* 512, 1024, 2048 or 4096 */ | ||||
| #define _MAX_SS    512  /* 512, 1024, 2048 or 4096 */ | ||||
| /* These options configure the range of sector size to be supported. (512, 1024, | ||||
| /  2048 or 4096) Always set both 512 for most systems, all type of memory cards and | ||||
| /  harddisk. But a larger value may be required for on-board flash memory and some | ||||
| /  type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured | ||||
| /  to variable sector size and GET_SECTOR_SIZE command must be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
|  | ||||
| #define	_USE_TRIM      0 | ||||
| /* This option switches support of ATA-TRIM. (0:Disable or 1:Enable) | ||||
| /  To enable Trim function, also CTRL_TRIM command should be implemented to the | ||||
| /  disk_ioctl() function. */ | ||||
|  | ||||
| #define _FS_NOFSINFO    0 /* 0,1,2 or 3 */ | ||||
| /* If you need to know correct free space on the FAT32 volume, set bit 0 of this | ||||
| /  option, and f_getfree() function at first time after volume mount will force | ||||
| /  a full FAT scan. Bit 1 controls the use of last allocated cluster number. | ||||
| / | ||||
| /  bit0=0: Use free cluster count in the FSINFO if available. | ||||
| /  bit0=1: Do not trust free cluster count in the FSINFO. | ||||
| /  bit1=0: Use last allocated cluster number in the FSINFO if available. | ||||
| /  bit1=1: Do not trust last allocated cluster number in the FSINFO. | ||||
| */ | ||||
|  | ||||
| /*---------------------------------------------------------------------------/ | ||||
| / System Configurations | ||||
| /----------------------------------------------------------------------------*/ | ||||
|  | ||||
| #define _FS_TINY    0      /* 0:Normal or 1:Tiny */ | ||||
| /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) | ||||
| /  At the tiny configuration, size of file object (FIL) is reduced _MAX_SS bytes. | ||||
| /  Instead of private sector buffer eliminated from the file object, common sector | ||||
| /  buffer in the file system object (FATFS) is used for the file data transfer. */ | ||||
|  | ||||
| #define _FS_EXFAT	0 | ||||
| /* This option switches support of exFAT file system. (0:Disable or 1:Enable) | ||||
| /  When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1) | ||||
| /  Note that enabling exFAT discards C89 compatibility. */ | ||||
|  | ||||
| #define _FS_NORTC	0 | ||||
| #define _NORTC_MON	6 | ||||
| #define _NORTC_MDAY	4 | ||||
| #define _NORTC_YEAR	2015 | ||||
| /* The option _FS_NORTC switches timestamp functiton. If the system does not have | ||||
| /  any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable | ||||
| /  the timestamp function. All objects modified by FatFs will have a fixed timestamp | ||||
| /  defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time. | ||||
| /  To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be | ||||
| /  added to the project to get current time form real-time clock. _NORTC_MON, | ||||
| /  _NORTC_MDAY and _NORTC_YEAR have no effect.  | ||||
| /  These options have no effect at read-only configuration (_FS_READONLY = 1). */ | ||||
|  | ||||
| #define _FS_LOCK    2     /* 0:Disable or >=1:Enable */ | ||||
| /* The option _FS_LOCK switches file lock function to control duplicated file open | ||||
| /  and illegal operation to open objects. This option must be 0 when _FS_READONLY | ||||
| /  is 1. | ||||
| / | ||||
| /  0:  Disable file lock function. To avoid volume corruption, application program | ||||
| /      should avoid illegal open, remove and rename to the open objects. | ||||
| /  >0: Enable file lock function. The value defines how many files/sub-directories | ||||
| /      can be opened simultaneously under file lock control. Note that the file | ||||
| /      lock control is independent of re-entrancy. */ | ||||
|  | ||||
| #define _FS_REENTRANT    1  /* 0:Disable or 1:Enable */ | ||||
| #define _FS_TIMEOUT      1000 /* Timeout period in unit of time ticks */ | ||||
| #define _SYNC_t          osMutexId_t | ||||
| /* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs | ||||
| /  module itself. Note that regardless of this option, file access to different | ||||
| /  volume is always re-entrant and volume control functions, f_mount(), f_mkfs() | ||||
| /  and f_fdisk() function, are always not re-entrant. Only file/directory access | ||||
| /  to the same volume is under control of this function. | ||||
| / | ||||
| /   0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. | ||||
| /   1: Enable re-entrancy. Also user provided synchronization handlers, | ||||
| /      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() | ||||
| /      function, must be added to the project. Samples are available in | ||||
| /      option/syscall.c. | ||||
| / | ||||
| /  The _FS_TIMEOUT defines timeout period in unit of time tick. | ||||
| /  The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, | ||||
| /  SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be | ||||
| /  included somewhere in the scope of ff.h. */ | ||||
|  | ||||
| /* define the ff_malloc ff_free macros as standard malloc free */ | ||||
| #if !defined(ff_malloc) && !defined(ff_free) | ||||
| #include <stdlib.h> | ||||
| #define ff_malloc  malloc | ||||
| #define ff_free  free | ||||
| #endif | ||||
|  | ||||
| #endif /* _FFCONF */ | ||||
							
								
								
									
										124
									
								
								firmware/targets/f3/Src/fatfs/spi_sd_hal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								firmware/targets/f3/Src/fatfs/spi_sd_hal.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| #include "main.h" | ||||
|  | ||||
| #define SD_DUMMY_BYTE 0xFF | ||||
| #define SD_CS_LOW() HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_RESET) | ||||
| #define SD_CS_HIGH() HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_SET) | ||||
|  | ||||
| const uint32_t SpiTimeout = 1000; | ||||
| extern SPI_HandleTypeDef SPI_SD_HANDLE; | ||||
| uint8_t SD_IO_WriteByte(uint8_t Data); | ||||
|  | ||||
| /****************************************************************************** | ||||
|                             BUS OPERATIONS | ||||
|  *******************************************************************************/ | ||||
|  | ||||
| /** | ||||
|  * @brief  SPI error treatment function | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SPIx_Error(void) { | ||||
|     /* De-initialize the SPI communication BUS */ | ||||
|     HAL_SPI_DeInit(&SPI_SD_HANDLE); | ||||
|  | ||||
|     /* Re-Initiaize the SPI communication BUS */ | ||||
|     HAL_SPI_Init(&SPI_SD_HANDLE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief  SPI Write byte(s) to device | ||||
|  * @param  DataIn: Pointer to data buffer to write | ||||
|  * @param  DataOut: Pointer to data buffer for read data | ||||
|  * @param  DataLength: number of bytes to write | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SPIx_WriteReadData(const uint8_t* DataIn, uint8_t* DataOut, uint16_t DataLength) { | ||||
|     HAL_StatusTypeDef status = HAL_OK; | ||||
|     status = | ||||
|         HAL_SPI_TransmitReceive(&SPI_SD_HANDLE, (uint8_t*)DataIn, DataOut, DataLength, SpiTimeout); | ||||
|  | ||||
|     /* Check the communication status */ | ||||
|     if(status != HAL_OK) { | ||||
|         /* Execute user timeout callback */ | ||||
|         SPIx_Error(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief  SPI Write a byte to device | ||||
|  * @param  Value: value to be written | ||||
|  * @retval None | ||||
|  */ | ||||
| __attribute__((unused)) static void SPIx_Write(uint8_t Value) { | ||||
|     HAL_StatusTypeDef status = HAL_OK; | ||||
|     uint8_t data; | ||||
|  | ||||
|     status = HAL_SPI_TransmitReceive(&SPI_SD_HANDLE, (uint8_t*)&Value, &data, 1, SpiTimeout); | ||||
|  | ||||
|     /* Check the communication status */ | ||||
|     if(status != HAL_OK) { | ||||
|         /* Execute user timeout callback */ | ||||
|         SPIx_Error(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /****************************************************************************** | ||||
|                             LINK OPERATIONS | ||||
|  *******************************************************************************/ | ||||
|  | ||||
| /********************************* LINK SD ************************************/ | ||||
| /** | ||||
|  * @brief  Initialize the SD Card and put it into StandBy State (Ready for | ||||
|  *         data transfer). | ||||
|  * @retval None | ||||
|  */ | ||||
| void SD_IO_Init(void) { | ||||
|     uint8_t counter = 0; | ||||
|  | ||||
|     /* SD chip select high */ | ||||
|     SD_CS_HIGH(); | ||||
|  | ||||
|     /* Send dummy byte 0xFF, 10 times with CS high */ | ||||
|     /* Rise CS and MOSI for 80 clocks cycles */ | ||||
|     for(counter = 0; counter <= 200; counter++) { | ||||
|         /* Send dummy byte 0xFF */ | ||||
|         SD_IO_WriteByte(SD_DUMMY_BYTE); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief  Set SD interface Chip Select state | ||||
|  * @param  val: 0 (low) or 1 (high) state | ||||
|  * @retval None | ||||
|  */ | ||||
| void SD_IO_CSState(uint8_t val) { | ||||
|     if(val == 1) { | ||||
|         SD_CS_HIGH(); | ||||
|     } else { | ||||
|         SD_CS_LOW(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief  Write byte(s) on the SD | ||||
|  * @param  DataIn: Pointer to data buffer to write | ||||
|  * @param  DataOut: Pointer to data buffer for read data | ||||
|  * @param  DataLength: number of bytes to write | ||||
|  * @retval None | ||||
|  */ | ||||
| void SD_IO_WriteReadData(const uint8_t* DataIn, uint8_t* DataOut, uint16_t DataLength) { | ||||
|     /* Send the byte */ | ||||
|     SPIx_WriteReadData(DataIn, DataOut, DataLength); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief  Write a byte on the SD. | ||||
|  * @param  Data: byte to send. | ||||
|  * @retval Data written | ||||
|  */ | ||||
| uint8_t SD_IO_WriteByte(uint8_t Data) { | ||||
|     uint8_t tmp; | ||||
|  | ||||
|     /* Send the byte */ | ||||
|     SPIx_WriteReadData(&Data, &tmp, 1); | ||||
|     return tmp; | ||||
| } | ||||
							
								
								
									
										1013
									
								
								firmware/targets/f3/Src/fatfs/stm32_adafruit_sd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1013
									
								
								firmware/targets/f3/Src/fatfs/stm32_adafruit_sd.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										251
									
								
								firmware/targets/f3/Src/fatfs/stm32_adafruit_sd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								firmware/targets/f3/Src/fatfs/stm32_adafruit_sd.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,251 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32_adafruit_sd.h | ||||
|   * @author  MCD Application Team | ||||
|   * @version V3.0.0 | ||||
|   * @date    23-December-2016 | ||||
|   * @brief   This file contains the common defines and functions prototypes for | ||||
|   *          the stm32_adafruit_sd.c driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> | ||||
|   * | ||||
|   * Redistribution and use in source and binary forms, with or without modification, | ||||
|   * are permitted provided that the following conditions are met: | ||||
|   *   1. Redistributions of source code must retain the above copyright notice, | ||||
|   *      this list of conditions and the following disclaimer. | ||||
|   *   2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|   *      this list of conditions and the following disclaimer in the documentation | ||||
|   *      and/or other materials provided with the distribution. | ||||
|   *   3. Neither the name of STMicroelectronics nor the names of its contributors | ||||
|   *      may be used to endorse or promote products derived from this software | ||||
|   *      without specific prior written permission. | ||||
|   * | ||||
|   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||
|   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||
|   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
|   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||
|   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */  | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32_ADAFRUIT_SD_H | ||||
| #define __STM32_ADAFRUIT_SD_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif  | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include <stdint.h> | ||||
|  | ||||
| /** @addtogroup BSP | ||||
|   * @{ | ||||
|   */  | ||||
| #define __IO    volatile    | ||||
|     | ||||
| /** @addtogroup STM32_ADAFRUIT | ||||
|   * @{ | ||||
|   */ | ||||
|      | ||||
| /** @defgroup STM32_ADAFRUIT_SD | ||||
|   * @{ | ||||
|   */     | ||||
|  | ||||
| /** @defgroup STM32_ADAFRUIT_SD_Exported_Types | ||||
|   * @{ | ||||
|   */ | ||||
|     | ||||
| /**  | ||||
|   * @brief  SD status structure definition   | ||||
|   */      | ||||
| enum {     | ||||
|       BSP_SD_OK = 0x00,       | ||||
|       MSD_OK = 0x00, | ||||
|       BSP_SD_ERROR = 0x01, | ||||
|       BSP_SD_TIMEOUT | ||||
| }; | ||||
|     | ||||
| typedef struct               | ||||
| { | ||||
|   uint8_t  Reserved1:2;               /* Reserved */ | ||||
|   uint16_t DeviceSize:12;             /* Device Size */ | ||||
|   uint8_t  MaxRdCurrentVDDMin:3;      /* Max. read current @ VDD min */ | ||||
|   uint8_t  MaxRdCurrentVDDMax:3;      /* Max. read current @ VDD max */ | ||||
|   uint8_t  MaxWrCurrentVDDMin:3;      /* Max. write current @ VDD min */ | ||||
|   uint8_t  MaxWrCurrentVDDMax:3;      /* Max. write current @ VDD max */ | ||||
|   uint8_t  DeviceSizeMul:3;           /* Device size multiplier */ | ||||
| } struct_v1; | ||||
|  | ||||
|  | ||||
| typedef struct               | ||||
| { | ||||
|   uint8_t  Reserved1:6;               /* Reserved */ | ||||
|   uint32_t DeviceSize:22;             /* Device Size */ | ||||
|   uint8_t  Reserved2:1;               /* Reserved */ | ||||
| } struct_v2; | ||||
|  | ||||
| /**  | ||||
|   * @brief  Card Specific Data: CSD Register | ||||
|   */  | ||||
| typedef struct | ||||
| { | ||||
|   /* Header part */ | ||||
|   uint8_t  CSDStruct:2;            /* CSD structure */ | ||||
|   uint8_t  Reserved1:6;            /* Reserved */ | ||||
|   uint8_t  TAAC:8;                 /* Data read access-time 1 */ | ||||
|   uint8_t  NSAC:8;                 /* Data read access-time 2 in CLK cycles */ | ||||
|   uint8_t  MaxBusClkFrec:8;        /* Max. bus clock frequency */ | ||||
|   uint16_t CardComdClasses:12;      /* Card command classes */ | ||||
|   uint8_t  RdBlockLen:4;           /* Max. read data block length */ | ||||
|   uint8_t  PartBlockRead:1;        /* Partial blocks for read allowed */ | ||||
|   uint8_t  WrBlockMisalign:1;      /* Write block misalignment */ | ||||
|   uint8_t  RdBlockMisalign:1;      /* Read block misalignment */ | ||||
|   uint8_t  DSRImpl:1;              /* DSR implemented */ | ||||
|    | ||||
|   /* v1 or v2 struct */ | ||||
|   union csd_version { | ||||
|     struct_v1 v1; | ||||
|     struct_v2 v2; | ||||
|   } version; | ||||
|    | ||||
|   uint8_t  EraseSingleBlockEnable:1;  /* Erase single block enable */ | ||||
|   uint8_t  EraseSectorSize:7;         /* Erase group size multiplier */ | ||||
|   uint8_t  WrProtectGrSize:7;         /* Write protect group size */ | ||||
|   uint8_t  WrProtectGrEnable:1;       /* Write protect group enable */ | ||||
|   uint8_t  Reserved2:2;               /* Reserved */ | ||||
|   uint8_t  WrSpeedFact:3;             /* Write speed factor */ | ||||
|   uint8_t  MaxWrBlockLen:4;           /* Max. write data block length */ | ||||
|   uint8_t  WriteBlockPartial:1;       /* Partial blocks for write allowed */ | ||||
|   uint8_t  Reserved3:5;               /* Reserved */ | ||||
|   uint8_t  FileFormatGrouop:1;        /* File format group */ | ||||
|   uint8_t  CopyFlag:1;                /* Copy flag (OTP) */ | ||||
|   uint8_t  PermWrProtect:1;           /* Permanent write protection */ | ||||
|   uint8_t  TempWrProtect:1;           /* Temporary write protection */ | ||||
|   uint8_t  FileFormat:2;              /* File Format */ | ||||
|   uint8_t  Reserved4:2;               /* Reserved */ | ||||
|   uint8_t  crc:7;                     /* Reserved */ | ||||
|   uint8_t  Reserved5:1;               /* always 1*/ | ||||
|    | ||||
| } SD_CSD; | ||||
|  | ||||
| /**  | ||||
|   * @brief  Card Identification Data: CID Register    | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   __IO uint8_t  ManufacturerID;       /* ManufacturerID */ | ||||
|   __IO uint16_t OEM_AppliID;          /* OEM/Application ID */ | ||||
|   __IO uint32_t ProdName1;            /* Product Name part1 */ | ||||
|   __IO uint8_t  ProdName2;            /* Product Name part2*/ | ||||
|   __IO uint8_t  ProdRev;              /* Product Revision */ | ||||
|   __IO uint32_t ProdSN;               /* Product Serial Number */ | ||||
|   __IO uint8_t  Reserved1;            /* Reserved1 */ | ||||
|   __IO uint16_t ManufactDate;         /* Manufacturing Date */ | ||||
|   __IO uint8_t  CID_CRC;              /* CID CRC */ | ||||
|   __IO uint8_t  Reserved2;            /* always 1 */ | ||||
| } SD_CID; | ||||
|  | ||||
| /**  | ||||
|   * @brief SD Card information  | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   SD_CSD Csd; | ||||
|   SD_CID Cid; | ||||
|   uint32_t CardCapacity;              /*!< Card Capacity */ | ||||
|   uint32_t CardBlockSize;             /*!< Card Block Size */ | ||||
|   uint32_t LogBlockNbr;               /*!< Specifies the Card logical Capacity in blocks   */ | ||||
|   uint32_t LogBlockSize;              /*!< Specifies logical block size in bytes           */ | ||||
| } SD_CardInfo; | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|    | ||||
| /** @defgroup STM32_ADAFRUIT_SPI_SD_Exported_Constants | ||||
|   * @{ | ||||
|   */  | ||||
|    | ||||
| /** | ||||
|   * @brief  Block Size | ||||
|   */ | ||||
| #define SD_BLOCK_SIZE    0x200 | ||||
|  | ||||
| /** | ||||
|   * @brief  SD detection on its memory slot | ||||
|   */ | ||||
| #define SD_PRESENT               ((uint8_t)0x01) | ||||
| #define SD_NOT_PRESENT           ((uint8_t)0x00) | ||||
|  | ||||
| #define SD_DATATIMEOUT           ((uint32_t)100000000) | ||||
|  | ||||
| /**  | ||||
|   * @brief SD Card information structure  | ||||
|   */    | ||||
| #define BSP_SD_CardInfo SD_CardInfo | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|    | ||||
| /** @defgroup STM32_ADAFRUIT_SD_Exported_Macro | ||||
|   * @{ | ||||
|   */  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */  | ||||
|  | ||||
| /** @defgroup STM32_ADAFRUIT_SD_Exported_Functions | ||||
|   * @{ | ||||
|   */    | ||||
| uint8_t BSP_SD_Init(void); | ||||
| uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout); | ||||
| uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout); | ||||
| uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr); | ||||
| uint8_t BSP_SD_GetCardState(void); | ||||
| uint8_t BSP_SD_GetCardInfo(SD_CardInfo *pCardInfo); | ||||
|     | ||||
| /* Link functions for SD Card peripheral*/ | ||||
| void    SD_SPI_Slow_Init(void); | ||||
| void    SD_SPI_Fast_Init(void); | ||||
| void    SD_IO_Init(void); | ||||
| void    SD_IO_CSState(uint8_t state); | ||||
| void    SD_IO_WriteReadData(const uint8_t *DataIn, uint8_t *DataOut, uint16_t DataLength); | ||||
| uint8_t SD_IO_WriteByte(uint8_t Data); | ||||
|  | ||||
| /* Link function for HAL delay */ | ||||
| void HAL_Delay(__IO uint32_t Delay); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __STM32_ADAFRUIT_SD_H */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */  | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										138
									
								
								firmware/targets/f3/Src/fatfs/syscall.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								firmware/targets/f3/Src/fatfs/syscall.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Sample code of OS dependent controls for FatFs                         */ | ||||
| /* (C)ChaN, 2014                                                          */ | ||||
| /*   Portions COPYRIGHT 2017 STMicroelectronics                           */ | ||||
| /*   Portions Copyright (C) 2014, ChaN, all right reserved                */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
|  | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. All rights reserved. | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                       opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
| **/ | ||||
|  | ||||
|  | ||||
|  | ||||
| #include "fatfs/ff.h" | ||||
|  | ||||
|  | ||||
| #if _FS_REENTRANT | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Create a Synchronization Object                                        */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called in f_mount() function to create a new | ||||
| /  synchronization object, such as semaphore and mutex. When a 0 is returned, | ||||
| /  the f_mount() function fails with FR_INT_ERR. | ||||
| */ | ||||
|  | ||||
| int ff_cre_syncobj (	/* 1:Function succeeded, 0:Could not create the sync object */ | ||||
| 	BYTE vol,			/* Corresponding volume (logical drive number) */ | ||||
| 	_SYNC_t *sobj		/* Pointer to return the created sync object */ | ||||
| ) | ||||
| { | ||||
|  | ||||
|     int ret; | ||||
|  | ||||
|     //osSemaphoreDef(SEM); | ||||
|     //*sobj = osSemaphoreCreate(osSemaphore(SEM), 1); | ||||
|     *sobj = osMutexNew(NULL); | ||||
|     ret = (*sobj != NULL); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Delete a Synchronization Object                                        */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called in f_mount() function to delete a synchronization | ||||
| /  object that created with ff_cre_syncobj() function. When a 0 is returned, | ||||
| /  the f_mount() function fails with FR_INT_ERR. | ||||
| */ | ||||
|  | ||||
| int ff_del_syncobj (	/* 1:Function succeeded, 0:Could not delete due to any error */ | ||||
| 	_SYNC_t sobj		/* Sync object tied to the logical drive to be deleted */ | ||||
| ) | ||||
| { | ||||
|     osMutexDelete(sobj); | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Request Grant to Access the Volume                                     */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called on entering file functions to lock the volume. | ||||
| /  When a 0 is returned, the file function fails with FR_TIMEOUT. | ||||
| */ | ||||
|  | ||||
| int ff_req_grant (	/* 1:Got a grant to access the volume, 0:Could not get a grant */ | ||||
| 	_SYNC_t sobj	/* Sync object to wait */ | ||||
| ) | ||||
| { | ||||
|   int ret = 0; | ||||
|  | ||||
|   if(osMutexAcquire(sobj, _FS_TIMEOUT) == osOK) { | ||||
|       ret = 1; | ||||
|   } | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Release Grant to Access the Volume                                     */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* This function is called on leaving file functions to unlock the volume. | ||||
| */ | ||||
|  | ||||
| void ff_rel_grant ( | ||||
| 	_SYNC_t sobj	/* Sync object to be signaled */ | ||||
| ) | ||||
| { | ||||
|     osMutexRelease(sobj); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #if _USE_LFN == 3	/* LFN with a working buffer on the heap */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Allocate a memory block                                                */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE. | ||||
| */ | ||||
|  | ||||
| void* ff_memalloc (	/* Returns pointer to the allocated memory block */ | ||||
| 	UINT msize		/* Number of bytes to allocate */ | ||||
| ) | ||||
| { | ||||
| 	return ff_malloc(msize);	/* Allocate a new memory block with POSIX API */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /*------------------------------------------------------------------------*/ | ||||
| /* Free a memory block                                                    */ | ||||
| /*------------------------------------------------------------------------*/ | ||||
|  | ||||
| void ff_memfree ( | ||||
| 	void* mblock	/* Pointer to the memory block to free */ | ||||
| ) | ||||
| { | ||||
| 	ff_free(mblock);	/* Discard the memory block with POSIX API */ | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										219
									
								
								firmware/targets/f3/Src/fatfs/user_diskio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								firmware/targets/f3/Src/fatfs/user_diskio.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /** | ||||
|  ****************************************************************************** | ||||
|  * @file    user_diskio.c | ||||
|  * @brief   This file includes a diskio driver skeleton to be completed by the user. | ||||
|  ****************************************************************************** | ||||
|  * @attention | ||||
|  * | ||||
|  * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|  * All rights reserved.</center></h2> | ||||
|  * | ||||
|  * This software component is licensed by ST under Ultimate Liberty license | ||||
|  * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|  * the License. You may obtain a copy of the License at: | ||||
|  *                             www.st.com/SLA0044 | ||||
|  * | ||||
|  ****************************************************************************** | ||||
|  */ | ||||
| /* USER CODE END Header */ | ||||
|  | ||||
| #ifdef USE_OBSOLETE_USER_CODE_SECTION_0 | ||||
| /*  | ||||
|  * Warning: the user section 0 is no more in use (starting from CubeMx version 4.16.0) | ||||
|  * To be suppressed in the future.  | ||||
|  * Kept to ensure backward compatibility with previous CubeMx versions when  | ||||
|  * migrating projects.  | ||||
|  * User code previously added there should be copied in the new user sections before  | ||||
|  * the section contents can be deleted. | ||||
|  */ | ||||
| /* USER CODE BEGIN 0 */ | ||||
| /* USER CODE END 0 */ | ||||
| #endif | ||||
|  | ||||
| /* USER CODE BEGIN DECL */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "user_diskio.h" | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
|  | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Disk status */ | ||||
| static volatile DSTATUS Stat = STA_NOINIT; | ||||
|  | ||||
| static DSTATUS User_CheckStatus(BYTE lun) { | ||||
|     Stat = STA_NOINIT; | ||||
|  | ||||
|     if(BSP_SD_GetCardState() == MSD_OK) { | ||||
|         Stat &= ~STA_NOINIT; | ||||
|     } | ||||
|  | ||||
|     return Stat; | ||||
| } | ||||
| /* USER CODE END DECL */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| DSTATUS USER_initialize(BYTE pdrv); | ||||
| DSTATUS USER_status(BYTE pdrv); | ||||
| DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count); | ||||
| #if _USE_WRITE == 1 | ||||
| DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| #if _USE_IOCTL == 1 | ||||
| DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff); | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
|  | ||||
| Diskio_drvTypeDef USER_Driver = { | ||||
|     USER_initialize, | ||||
|     USER_status, | ||||
|     USER_read, | ||||
| #if _USE_WRITE | ||||
|     USER_write, | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
| #if _USE_IOCTL == 1 | ||||
|     USER_ioctl, | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
| }; | ||||
|  | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
|  | ||||
| /** | ||||
|   * @brief  Initializes a Drive | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @retval DSTATUS: Operation status | ||||
|   */ | ||||
| DSTATUS USER_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN INIT */ | ||||
|     return User_CheckStatus(pdrv); | ||||
|     /* USER CODE END INIT */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Gets Disk Status  | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @retval DSTATUS: Operation status | ||||
|   */ | ||||
| DSTATUS USER_status(BYTE pdrv /* Physical drive number to identify the drive */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN STATUS */ | ||||
|     return Stat; | ||||
|     /* USER CODE END STATUS */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Reads Sector(s)  | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  *buff: Data buffer to store read data | ||||
|   * @param  sector: Sector address (LBA) | ||||
|   * @param  count: Number of sectors to read (1..128) | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| DRESULT USER_read( | ||||
|     BYTE pdrv, /* Physical drive nmuber to identify the drive */ | ||||
|     BYTE* buff, /* Data buffer to store read data */ | ||||
|     DWORD sector, /* Sector address in LBA */ | ||||
|     UINT count /* Number of sectors to read */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN READ */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|     if(BSP_SD_ReadBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) { | ||||
|         /* wait until the read operation is finished */ | ||||
|         while(BSP_SD_GetCardState() != MSD_OK) { | ||||
|         } | ||||
|         res = RES_OK; | ||||
|     } | ||||
|  | ||||
|     return res; | ||||
|     /* USER CODE END READ */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Writes Sector(s)   | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  *buff: Data to be written | ||||
|   * @param  sector: Sector address (LBA) | ||||
|   * @param  count: Number of sectors to write (1..128) | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| #if _USE_WRITE == 1 | ||||
| DRESULT USER_write( | ||||
|     BYTE pdrv, /* Physical drive nmuber to identify the drive */ | ||||
|     const BYTE* buff, /* Data to be written */ | ||||
|     DWORD sector, /* Sector address in LBA */ | ||||
|     UINT count /* Number of sectors to write */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN WRITE */ | ||||
|     /* USER CODE HERE */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|  | ||||
|     if(BSP_SD_WriteBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) { | ||||
|         /* wait until the Write operation is finished */ | ||||
|         while(BSP_SD_GetCardState() != MSD_OK) { | ||||
|         } | ||||
|         res = RES_OK; | ||||
|     } | ||||
|  | ||||
|     return res; | ||||
|     /* USER CODE END WRITE */ | ||||
| } | ||||
| #endif /* _USE_WRITE == 1 */ | ||||
|  | ||||
| /** | ||||
|   * @brief  I/O control operation   | ||||
|   * @param  pdrv: Physical drive number (0..) | ||||
|   * @param  cmd: Control code | ||||
|   * @param  *buff: Buffer to send/receive control data | ||||
|   * @retval DRESULT: Operation result | ||||
|   */ | ||||
| #if _USE_IOCTL == 1 | ||||
| DRESULT USER_ioctl( | ||||
|     BYTE pdrv, /* Physical drive nmuber (0..) */ | ||||
|     BYTE cmd, /* Control code */ | ||||
|     void* buff /* Buffer to send/receive control data */ | ||||
| ) { | ||||
|     /* USER CODE BEGIN IOCTL */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|     BSP_SD_CardInfo CardInfo; | ||||
|  | ||||
|     if(Stat & STA_NOINIT) return RES_NOTRDY; | ||||
|  | ||||
|     switch(cmd) { | ||||
|     /* Make sure that no pending write process */ | ||||
|     case CTRL_SYNC: | ||||
|         res = RES_OK; | ||||
|         break; | ||||
|  | ||||
|     /* Get number of sectors on the disk (DWORD) */ | ||||
|     case GET_SECTOR_COUNT: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(DWORD*)buff = CardInfo.LogBlockNbr; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
|  | ||||
|     /* Get R/W sector size (WORD) */ | ||||
|     case GET_SECTOR_SIZE: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(WORD*)buff = CardInfo.LogBlockSize; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
|  | ||||
|     /* Get erase block size in unit of sector (DWORD) */ | ||||
|     case GET_BLOCK_SIZE: | ||||
|         BSP_SD_GetCardInfo(&CardInfo); | ||||
|         *(DWORD*)buff = CardInfo.LogBlockSize; | ||||
|         res = RES_OK; | ||||
|         break; | ||||
|  | ||||
|     default: | ||||
|         res = RES_PARERR; | ||||
|     } | ||||
|  | ||||
|     return res; | ||||
|     /* USER CODE END IOCTL */ | ||||
| } | ||||
| #endif /* _USE_IOCTL == 1 */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										48
									
								
								firmware/targets/f3/Src/fatfs/user_diskio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								firmware/targets/f3/Src/fatfs/user_diskio.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /** | ||||
|  ****************************************************************************** | ||||
|   * @file    user_diskio.h | ||||
|   * @brief   This file contains the common defines and functions prototypes for   | ||||
|   *          the user_diskio driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2020 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USER_DISKIO_H | ||||
| #define __USER_DISKIO_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* USER CODE BEGIN 0 */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32_adafruit_sd.h" | ||||
| #include "fatfs/ff_gen_drv.h" | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /* Exported functions ------------------------------------------------------- */ | ||||
| extern Diskio_drvTypeDef USER_Driver; | ||||
|  | ||||
| /* USER CODE END 0 */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __USER_DISKIO_H */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
		Reference in New Issue
	
	Block a user