Преглед изворни кода

1.补充提交缺失文件;

libo пре 2 година
родитељ
комит
34ea434419

+ 288 - 0
Middlewares/Third_Party/FatFs/src/00history.txt

@@ -0,0 +1,288 @@
+----------------------------------------------------------------------------
+  Revision history of FatFs module
+----------------------------------------------------------------------------
+
+R0.00 (February 26, 2006)
+
+  Prototype.
+
+
+
+R0.01 (April 29, 2006)
+
+  The first release.
+
+
+
+R0.02 (June 01, 2006)
+
+  Added FAT12 support.
+  Removed unbuffered mode.
+  Fixed a problem on small (<32M) partition.
+
+
+
+R0.02a (June 10, 2006)
+
+  Added a configuration option (_FS_MINIMUM).
+
+
+
+R0.03 (September 22, 2006)
+
+  Added f_rename().
+  Changed option _FS_MINIMUM to _FS_MINIMIZE.
+
+
+
+R0.03a (December 11, 2006)
+
+  Improved cluster scan algorithm to write files fast.
+  Fixed f_mkdir() creates incorrect directory on FAT32.
+
+
+
+R0.04 (February 04, 2007)
+
+  Added f_mkfs().
+  Supported multiple drive system.
+  Changed some interfaces for multiple drive system.
+  Changed f_mountdrv() to f_mount().
+
+
+
+R0.04a (April 01, 2007)
+
+  Supported multiple partitions on a physical drive.
+  Added a capability of extending file size to f_lseek().
+  Added minimization level 3.
+  Fixed an endian sensitive code in f_mkfs().
+
+
+
+R0.04b (May 05, 2007)
+
+  Added a configuration option _USE_NTFLAG.
+  Added FSINFO support.
+  Fixed DBCS name can result FR_INVALID_NAME.
+  Fixed short seek (<= csize) collapses the file object.
+
+
+
+R0.05 (August 25, 2007)
+
+  Changed arguments of f_read(), f_write() and f_mkfs().
+  Fixed f_mkfs() on FAT32 creates incorrect FSINFO.
+  Fixed f_mkdir() on FAT32 creates incorrect directory.
+
+
+
+R0.05a (February 03, 2008)
+
+  Added f_truncate() and f_utime().
+  Fixed off by one error at FAT sub-type determination.
+  Fixed btr in f_read() can be mistruncated.
+  Fixed cached sector is not flushed when create and close without write.
+
+
+
+R0.06 (April 01, 2008)
+
+  Added fputc(), fputs(), fprintf() and fgets().
+  Improved performance of f_lseek() on moving to the same or following cluster.
+
+
+
+R0.07 (April 01, 2009)
+
+  Merged Tiny-FatFs as a configuration option. (_FS_TINY)
+  Added long file name feature. (_USE_LFN)
+  Added multiple code page feature. (_CODE_PAGE)
+  Added re-entrancy for multitask operation. (_FS_REENTRANT)
+  Added auto cluster size selection to f_mkfs().
+  Added rewind option to f_readdir().
+  Changed result code of critical errors.
+  Renamed string functions to avoid name collision.
+
+
+
+R0.07a (April 14, 2009)
+
+  Septemberarated out OS dependent code on reentrant cfg.
+  Added multiple sector size feature.
+
+
+
+R0.07c (June 21, 2009)
+
+  Fixed f_unlink() can return FR_OK on error.
+  Fixed wrong cache control in f_lseek().
+  Added relative path feature.
+  Added f_chdir() and f_chdrive().
+  Added proper case conversion to extended character.
+
+
+
+R0.07e (November 03, 2009)
+
+  Septemberarated out configuration options from ff.h to ffconf.h.
+  Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH.
+  Fixed name matching error on the 13 character boundary.
+  Added a configuration option, _LFN_UNICODE.
+  Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.
+
+
+
+R0.08 (May 15, 2010)
+
+  Added a memory configuration option. (_USE_LFN = 3)
+  Added file lock feature. (_FS_SHARE)
+  Added fast seek feature. (_USE_FASTSEEK)
+  Changed some types on the API, XCHAR->TCHAR.
+  Changed .fname in the FILINFO structure on Unicode cfg.
+  String functions support UTF-8 encoding files on Unicode cfg.
+
+
+
+R0.08a (August 16, 2010)
+
+  Added f_getcwd(). (_FS_RPATH = 2)
+  Added sector erase feature. (_USE_ERASE)
+  Moved file lock semaphore table from fs object to the bss.
+  Fixed f_mkfs() creates wrong FAT32 volume.
+
+
+
+R0.08b (January 15, 2011)
+
+  Fast seek feature is also applied to f_read() and f_write().
+  f_lseek() reports required table size on creating CLMP.
+  Extended format syntax of f_printf().
+  Ignores duplicated directory separators in given path name.
+
+
+
+R0.09 (September 06, 2011)
+
+  f_mkfs() supports multiple partition to complete the multiple partition feature.
+  Added f_fdisk().
+
+
+
+R0.09a (August 27, 2012)
+
+  Changed f_open() and f_opendir() reject null object pointer to avoid crash.
+  Changed option name _FS_SHARE to _FS_LOCK.
+  Fixed assertion failure due to OS/2 EA on FAT12/16 volume.
+
+
+
+R0.09b (January 24, 2013)
+
+  Added f_setlabel() and f_getlabel().
+
+
+
+R0.10 (October 02, 2013)
+
+  Added selection of character encoding on the file. (_STRF_ENCODE)
+  Added f_closedir().
+  Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO)
+  Added forced mount feature with changes of f_mount().
+  Improved behavior of volume auto detection.
+  Improved write throughput of f_puts() and f_printf().
+  Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write().
+  Fixed f_write() can be truncated when the file size is close to 4GB.
+  Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error.
+
+
+
+R0.10a (January 15, 2014)
+
+  Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID)
+  Added a configuration option of minimum sector size. (_MIN_SS)
+  2nd argument of f_rename() can have a drive number and it will be ignored.
+  Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10)
+  Fixed f_close() invalidates the file object without volume lock.
+  Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10)
+  Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07)
+
+
+
+R0.10b (May 19, 2014)
+
+  Fixed a hard error in the disk I/O layer can collapse the directory entry.
+  Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07)
+
+
+
+R0.10c (November 09, 2014)
+
+  Added a configuration option for the platforms without RTC. (_FS_NORTC)
+  Changed option name _USE_ERASE to _USE_TRIM.
+  Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b)
+  Fixed a potential problem of FAT access that can appear on disk error.
+  Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08)
+
+
+
+R0.11 (February 09, 2015)
+
+  Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND)
+  Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c)
+  Fixed _FS_NORTC option does not work properly. (appeared at R0.10c)
+
+
+
+R0.11a (September 05, 2015)
+
+  Fixed wrong media change can lead a deadlock at thread-safe configuration.
+  Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE)
+  Removed some code pages actually not exist on the standard systems. (_CODE_PAGE)
+  Fixed errors in the case conversion teble of code page 437 and 850 (ff.c).
+  Fixed errors in the case conversion teble of Unicode (cc*.c).
+
+
+
+R0.12 (April 12, 2016)
+
+  Added support for exFAT file system. (_FS_EXFAT)
+  Added f_expand(). (_USE_EXPAND)
+  Changed some members in FINFO structure and behavior of f_readdir().
+  Added an option _USE_CHMOD.
+  Removed an option _WORD_ACCESS.
+  Fixed errors in the case conversion table of Unicode (cc*.c).
+
+
+
+R0.12a (July 10, 2016)
+
+  Added support for creating exFAT volume with some changes of f_mkfs().
+  Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed.
+  f_forward() is available regardless of _FS_TINY.
+  Fixed f_mkfs() creates wrong volume. (appeared at R0.12)
+  Fixed wrong memory read in create_name(). (appeared at R0.12)
+  Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD.
+
+
+
+R0.12b (September 04, 2016)
+
+  Made f_rename() be able to rename objects with the same name but case.
+  Fixed an error in the case conversion teble of code page 866. (ff.c)
+  Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12)
+  Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12)
+  Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12)
+  Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12)
+  Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12)
+  Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12)
+
+
+
+R0.12c (March 04, 2017)
+
+  Improved write throughput at the fragmented file on the exFAT volume.
+  Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN.
+  Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12)
+  Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c)
+

+ 21 - 0
Middlewares/Third_Party/FatFs/src/00readme.txt

@@ -0,0 +1,21 @@
+FatFs Module Source Files R0.12c
+
+
+FILES
+
+  00readme.txt   This file.
+  00history.txt  Revision history.
+  ff.c           FatFs module.
+  ffconf.h       Configuration file of FatFs module.
+  ff.h           Common include file for FatFs and application module.
+  diskio.h       Common include file for FatFs and disk I/O module.
+  diskio.c       An example of glue function to attach existing disk I/O module to FatFs.
+  integer.h      Integer type definitions for FatFs.
+  option         Optional external modules.
+
+
+  Low level disk I/O module is not included in this archive because the FatFs
+  module is only a generic file system layer and it does not depend on any specific
+  storage device. You have to provide a low level disk I/O module written to
+  control the storage device that attached to the target system.
+

+ 141 - 0
Middlewares/Third_Party/FatFs/src/diskio.c

@@ -0,0 +1,141 @@
+/*-----------------------------------------------------------------------*/
+/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2017        */
+/*                                                                       */
+/*   Portions COPYRIGHT 2017 STMicroelectronics                          */
+/*   Portions Copyright (C) 2017, ChaN, all right reserved               */
+/*-----------------------------------------------------------------------*/
+/* If a working storage control module is available, it should be        */
+/* attached to the FatFs via a glue function rather than modifying it.   */
+/* This is an example of glue functions to attach various existing      */
+/* storage control modules to the FatFs module with a defined API.       */
+/*-----------------------------------------------------------------------*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "diskio.h"
+#include "ff_gen_drv.h"
+
+#if defined ( __GNUC__ )
+#ifndef __weak
+#define __weak __attribute__((weak))
+#endif
+#endif
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+extern Disk_drvTypeDef  disk;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+  * @brief  Gets Disk Status
+  * @param  pdrv: Physical drive number (0..)
+  * @retval DSTATUS: Operation status
+  */
+DSTATUS disk_status (
+	BYTE pdrv		/* Physical drive number to identify the drive */
+)
+{
+  DSTATUS stat;
+
+  stat = disk.drv[pdrv]->disk_status(disk.lun[pdrv]);
+  return stat;
+}
+
+/**
+  * @brief  Initializes a Drive
+  * @param  pdrv: Physical drive number (0..)
+  * @retval DSTATUS: Operation status
+  */
+DSTATUS disk_initialize (
+	BYTE pdrv				/* Physical drive nmuber to identify the drive */
+)
+{
+  DSTATUS stat = RES_OK;
+
+  if(disk.is_initialized[pdrv] == 0)
+  {
+    disk.is_initialized[pdrv] = 1;
+    stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);
+  }
+  return stat;
+}
+
+/**
+  * @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 disk_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 */
+)
+{
+  DRESULT res;
+
+  res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count);
+  return res;
+}
+
+/**
+  * @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 disk_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 */
+)
+{
+  DRESULT res;
+
+  res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count);
+  return res;
+}
+#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 disk_ioctl (
+	BYTE pdrv,		/* Physical drive nmuber (0..) */
+	BYTE cmd,		/* Control code */
+	void *buff		/* Buffer to send/receive control data */
+)
+{
+  DRESULT res;
+
+  res = disk.drv[pdrv]->disk_ioctl(disk.lun[pdrv], cmd, buff);
+  return res;
+}
+#endif /* _USE_IOCTL == 1 */
+
+/**
+  * @brief  Gets Time from RTC
+  * @param  None
+  * @retval Time in DWORD
+  */
+__weak DWORD get_fattime (void)
+{
+  return 0;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+

+ 80 - 0
Middlewares/Third_Party/FatFs/src/diskio.h

@@ -0,0 +1,80 @@
+/*-----------------------------------------------------------------------/
+/  Low level disk interface modlue include file   (C)ChaN, 2014          /
+/-----------------------------------------------------------------------*/
+
+#ifndef _DISKIO_DEFINED
+#define _DISKIO_DEFINED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define _USE_WRITE	1	/* 1: Enable disk_write function */
+#define _USE_IOCTL	1	/* 1: Enable disk_ioctl function */
+
+#include "integer.h"
+
+
+/* Status of Disk Functions */
+typedef BYTE	DSTATUS;
+
+/* Results of Disk Functions */
+typedef enum {
+	RES_OK = 0,		/* 0: Successful */
+	RES_ERROR,		/* 1: R/W Error */
+	RES_WRPRT,		/* 2: Write Protected */
+	RES_NOTRDY,		/* 3: Not Ready */
+	RES_PARERR		/* 4: Invalid Parameter */
+} DRESULT;
+
+
+/*---------------------------------------*/
+/* Prototypes for disk control functions */
+
+
+DSTATUS disk_initialize (BYTE pdrv);
+DSTATUS disk_status (BYTE pdrv);
+DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
+DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
+DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
+DWORD get_fattime (void);
+
+/* Disk Status Bits (DSTATUS) */
+
+#define STA_NOINIT		0x01	/* Drive not initialized */
+#define STA_NODISK		0x02	/* No medium in the drive */
+#define STA_PROTECT		0x04	/* Write protected */
+
+
+/* Command code for disk_ioctrl fucntion */
+
+/* Generic command (Used by FatFs) */
+#define CTRL_SYNC		0	/* Complete pending write process (needed at _FS_READONLY == 0) */
+#define GET_SECTOR_COUNT	1	/* Get media size (needed at _USE_MKFS == 1) */
+#define GET_SECTOR_SIZE		2	/* Get sector size (needed at _MAX_SS != _MIN_SS) */
+#define GET_BLOCK_SIZE		3	/* Get erase block size (needed at _USE_MKFS == 1) */
+#define CTRL_TRIM		4	/* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */
+
+/* Generic command (Not used by FatFs) */
+#define CTRL_POWER			5	/* Get/Set power status */
+#define CTRL_LOCK			6	/* Lock/Unlock media removal */
+#define CTRL_EJECT			7	/* Eject media */
+#define CTRL_FORMAT			8	/* Create physical format on the media */
+
+/* MMC/SDC specific ioctl command */
+#define MMC_GET_TYPE		10	/* Get card type */
+#define MMC_GET_CSD			11	/* Get CSD */
+#define MMC_GET_CID			12	/* Get CID */
+#define MMC_GET_OCR			13	/* Get OCR */
+#define MMC_GET_SDSTAT		14	/* Get SD status */
+
+/* ATA/CF specific ioctl command */
+#define ATA_GET_REV			20	/* Get F/W revision */
+#define ATA_GET_MODEL		21	/* Get model name */
+#define ATA_GET_SN			22	/* Get serial number */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

Разлика између датотеке није приказан због своје велике величине
+ 6140 - 0
Middlewares/Third_Party/FatFs/src/ff.c


+ 361 - 0
Middlewares/Third_Party/FatFs/src/ff.h

@@ -0,0 +1,361 @@
+/*----------------------------------------------------------------------------/
+/  FatFs - Generic FAT file system module  R0.12c                             /
+/-----------------------------------------------------------------------------/
+/
+/ Copyright (C) 2017, ChaN, all right reserved.
+/
+/ FatFs module is an open source software. Redistribution and use of FatFs in
+/ source and binary forms, with or without modification, are permitted provided
+/ that the following condition is met:
+
+/ 1. Redistributions of source code must retain the above copyright notice,
+/    this condition and the following disclaimer.
+/
+/ This software is provided by the copyright holder and contributors "AS IS"
+/ and any warranties related to this software are DISCLAIMED.
+/ The copyright owner or contributors be NOT LIABLE for any damages caused
+/ by use of this software.
+/----------------------------------------------------------------------------*/
+
+
+#ifndef _FATFS
+#define _FATFS	68300	/* Revision ID */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "integer.h"	/* Basic integer types */
+#include "ffconf.h"		/* FatFs configuration options */
+
+#if _FATFS != _FFCONF
+#error Wrong configuration file (ffconf.h).
+#endif
+
+
+
+/* Definitions of volume management */
+
+#if _MULTI_PARTITION		/* Multiple partition configuration */
+typedef struct {
+	BYTE pd;	/* Physical drive number */
+	BYTE pt;	/* Partition: 0:Auto detect, 1-4:Forced partition) */
+} PARTITION;
+extern PARTITION VolToPart[];	/* Volume - Partition resolution table */
+#endif
+
+
+
+/* Type of path name strings on FatFs API */
+
+#if _LFN_UNICODE			/* Unicode (UTF-16) string */
+#if _USE_LFN == 0
+#error _LFN_UNICODE must be 0 at non-LFN cfg.
+#endif
+#ifndef _INC_TCHAR
+typedef WCHAR TCHAR;
+#define _T(x) L ## x
+#define _TEXT(x) L ## x
+#endif
+#else						/* ANSI/OEM string */
+#ifndef _INC_TCHAR
+typedef char TCHAR;
+#define _T(x) x
+#define _TEXT(x) x
+#endif
+#endif
+
+
+
+/* Type of file size variables */
+
+#if _FS_EXFAT
+#if _USE_LFN == 0
+#error LFN must be enabled when enable exFAT
+#endif
+typedef QWORD FSIZE_t;
+#else
+typedef DWORD FSIZE_t;
+#endif
+
+
+
+/* File system object structure (FATFS) */
+
+typedef struct {
+	BYTE	fs_type;		/* File system type (0:N/A) */
+	BYTE	drv;			/* Physical drive number */
+	BYTE	n_fats;			/* Number of FATs (1 or 2) */
+	BYTE	wflag;			/* win[] flag (b0:dirty) */
+	BYTE	fsi_flag;		/* FSINFO flags (b7:disabled, b0:dirty) */
+	WORD	id;				/* File system mount ID */
+	WORD	n_rootdir;		/* Number of root directory entries (FAT12/16) */
+	WORD	csize;			/* Cluster size [sectors] */
+#if _MAX_SS != _MIN_SS
+	WORD	ssize;			/* Sector size (512, 1024, 2048 or 4096) */
+#endif
+#if _USE_LFN != 0
+	WCHAR*	lfnbuf;			/* LFN working buffer */
+#endif
+#if _FS_EXFAT
+	BYTE*	dirbuf;			/* Directory entry block scratchpad buffer */
+#endif
+#if _FS_REENTRANT
+	_SYNC_t	sobj;			/* Identifier of sync object */
+#endif
+#if !_FS_READONLY
+	DWORD	last_clst;		/* Last allocated cluster */
+	DWORD	free_clst;		/* Number of free clusters */
+#endif
+#if _FS_RPATH != 0
+	DWORD	cdir;			/* Current directory start cluster (0:root) */
+#if _FS_EXFAT
+	DWORD	cdc_scl;		/* Containing directory start cluster (invalid when cdir is 0) */
+	DWORD	cdc_size;		/* b31-b8:Size of containing directory, b7-b0: Chain status */
+	DWORD	cdc_ofs;		/* Offset in the containing directory (invalid when cdir is 0) */
+#endif
+#endif
+	DWORD	n_fatent;		/* Number of FAT entries (number of clusters + 2) */
+	DWORD	fsize;			/* Size of an FAT [sectors] */
+	DWORD	volbase;		/* Volume base sector */
+	DWORD	fatbase;		/* FAT base sector */
+	DWORD	dirbase;		/* Root directory base sector/cluster */
+	DWORD	database;		/* Data base sector */
+	DWORD	winsect;		/* Current sector appearing in the win[] */
+	BYTE	win[_MAX_SS];	/* Disk access window for Directory, FAT (and file data at tiny cfg) */
+} FATFS;
+
+
+
+/* Object ID and allocation information (_FDID) */
+
+typedef struct {
+	FATFS*	fs;			/* Pointer to the owner file system object */
+	WORD	id;			/* Owner file system mount ID */
+	BYTE	attr;		/* Object attribute */
+	BYTE	stat;		/* Object chain status (b1-0: =0:not contiguous, =2:contiguous (no data on FAT), =3:flagmented in this session, b2:sub-directory stretched) */
+	DWORD	sclust;		/* Object start cluster (0:no cluster or root directory) */
+	FSIZE_t	objsize;	/* Object size (valid when sclust != 0) */
+#if _FS_EXFAT
+	DWORD	n_cont;		/* Size of first fragment, clusters - 1 (valid when stat == 3) */
+	DWORD	n_frag;		/* Size of last fragment needs to be written (valid when not zero) */
+	DWORD	c_scl;		/* Containing directory start cluster (valid when sclust != 0) */
+	DWORD	c_size;		/* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */
+	DWORD	c_ofs;		/* Offset in the containing directory (valid when sclust != 0 and non-directory object) */
+#endif
+#if _FS_LOCK != 0
+	UINT	lockid;		/* File lock ID origin from 1 (index of file semaphore table Files[]) */
+#endif
+} _FDID;
+
+
+
+/* File object structure (FIL) */
+
+typedef struct {
+	_FDID	obj;			/* Object identifier (must be the 1st member to detect invalid object pointer) */
+	BYTE	flag;			/* File status flags */
+	BYTE	err;			/* Abort flag (error code) */
+	FSIZE_t	fptr;			/* File read/write pointer (Zeroed on file open) */
+	DWORD	clust;			/* Current cluster of fpter (invalid when fptr is 0) */
+	DWORD	sect;			/* Sector number appearing in buf[] (0:invalid) */
+#if !_FS_READONLY
+	DWORD	dir_sect;		/* Sector number containing the directory entry */
+	BYTE*	dir_ptr;		/* Pointer to the directory entry in the win[] */
+#endif
+#if _USE_FASTSEEK
+	DWORD*	cltbl;			/* Pointer to the cluster link map table (nulled on open, set by application) */
+#endif
+#if !_FS_TINY
+	BYTE	buf[_MAX_SS];	/* File private data read/write window */
+#endif
+} FIL;
+
+
+
+/* Directory object structure (DIR) */
+
+typedef struct {
+	_FDID	obj;			/* Object identifier */
+	DWORD	dptr;			/* Current read/write offset */
+	DWORD	clust;			/* Current cluster */
+	DWORD	sect;			/* Current sector (0:Read operation has terminated) */
+	BYTE*	dir;			/* Pointer to the directory item in the win[] */
+	BYTE	fn[12];			/* SFN (in/out) {body[8],ext[3],status[1]} */
+#if _USE_LFN != 0
+	DWORD	blk_ofs;		/* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */
+#endif
+#if _USE_FIND
+	const TCHAR* pat;		/* Pointer to the name matching pattern */
+#endif
+} DIR;
+
+
+
+/* File information structure (FILINFO) */
+
+typedef struct {
+	FSIZE_t	fsize;			/* File size */
+	WORD	fdate;			/* Modified date */
+	WORD	ftime;			/* Modified time */
+	BYTE	fattrib;		/* File attribute */
+#if _USE_LFN != 0
+	TCHAR	altname[13];			/* Alternative file name */
+	TCHAR	fname[_MAX_LFN + 1];	/* Primary file name */
+#else
+	TCHAR	fname[13];		/* File name */
+#endif
+} FILINFO;
+
+
+
+/* File function return code (FRESULT) */
+
+typedef enum {
+	FR_OK = 0,				/* (0) Succeeded */
+	FR_DISK_ERR,			/* (1) A hard error occurred in the low level disk I/O layer */
+	FR_INT_ERR,				/* (2) Assertion failed */
+	FR_NOT_READY,			/* (3) The physical drive cannot work */
+	FR_NO_FILE,				/* (4) Could not find the file */
+	FR_NO_PATH,				/* (5) Could not find the path */
+	FR_INVALID_NAME,		/* (6) The path name format is invalid */
+	FR_DENIED,				/* (7) Access denied due to prohibited access or directory full */
+	FR_EXIST,				/* (8) Access denied due to prohibited access */
+	FR_INVALID_OBJECT,		/* (9) The file/directory object is invalid */
+	FR_WRITE_PROTECTED,		/* (10) The physical drive is write protected */
+	FR_INVALID_DRIVE,		/* (11) The logical drive number is invalid */
+	FR_NOT_ENABLED,			/* (12) The volume has no work area */
+	FR_NO_FILESYSTEM,		/* (13) There is no valid FAT volume */
+	FR_MKFS_ABORTED,		/* (14) The f_mkfs() aborted due to any problem */
+	FR_TIMEOUT,				/* (15) Could not get a grant to access the volume within defined period */
+	FR_LOCKED,				/* (16) The operation is rejected according to the file sharing policy */
+	FR_NOT_ENOUGH_CORE,		/* (17) LFN working buffer could not be allocated */
+	FR_TOO_MANY_OPEN_FILES,	/* (18) Number of open files > _FS_LOCK */
+	FR_INVALID_PARAMETER	/* (19) Given parameter is invalid */
+} FRESULT;
+
+
+
+/*--------------------------------------------------------------*/
+/* FatFs module application interface                           */
+
+FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode);				/* Open or create a file */
+FRESULT f_close (FIL* fp);											/* Close an open file object */
+FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br);			/* Read data from the file */
+FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw);	/* Write data to the file */
+FRESULT f_lseek (FIL* fp, FSIZE_t ofs);								/* Move file pointer of the file object */
+FRESULT f_truncate (FIL* fp);										/* Truncate the file */
+FRESULT f_sync (FIL* fp);											/* Flush cached data of the writing file */
+FRESULT f_opendir (DIR* dp, const TCHAR* path);						/* Open a directory */
+FRESULT f_closedir (DIR* dp);										/* Close an open directory */
+FRESULT f_readdir (DIR* dp, FILINFO* fno);							/* Read a directory item */
+FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern);	/* Find first file */
+FRESULT f_findnext (DIR* dp, FILINFO* fno);							/* Find next file */
+FRESULT f_mkdir (const TCHAR* path);								/* Create a sub directory */
+FRESULT f_unlink (const TCHAR* path);								/* Delete an existing file or directory */
+FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new);	/* Rename/Move a file or directory */
+FRESULT f_stat (const TCHAR* path, FILINFO* fno);					/* Get file status */
+FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask);			/* Change attribute of a file/dir */
+FRESULT f_utime (const TCHAR* path, const FILINFO* fno);			/* Change timestamp of a file/dir */
+FRESULT f_chdir (const TCHAR* path);								/* Change current directory */
+FRESULT f_chdrive (const TCHAR* path);								/* Change current drive */
+FRESULT f_getcwd (TCHAR* buff, UINT len);							/* Get current directory */
+FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs);	/* Get number of free clusters on the drive */
+FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn);	/* Get volume label */
+FRESULT f_setlabel (const TCHAR* label);							/* Set volume label */
+FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);	/* Forward data to the stream */
+FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt);					/* Allocate a contiguous block to the file */
+FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);			/* Mount/Unmount a logical drive */
+FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len);	/* Create a FAT volume */
+FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work);			/* Divide a physical drive into some partitions */
+int f_putc (TCHAR c, FIL* fp);										/* Put a character to the file */
+int f_puts (const TCHAR* str, FIL* cp);								/* Put a string to the file */
+int f_printf (FIL* fp, const TCHAR* str, ...);						/* Put a formatted string to the file */
+TCHAR* f_gets (TCHAR* buff, int len, FIL* fp);						/* Get a string from the file */
+
+#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))
+#define f_error(fp) ((fp)->err)
+#define f_tell(fp) ((fp)->fptr)
+#define f_size(fp) ((fp)->obj.objsize)
+#define f_rewind(fp) f_lseek((fp), 0)
+#define f_rewinddir(dp) f_readdir((dp), 0)
+#define f_rmdir(path) f_unlink(path)
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+
+
+
+/*--------------------------------------------------------------*/
+/* Additional user defined functions                            */
+
+/* RTC function */
+#if !_FS_READONLY && !_FS_NORTC
+DWORD get_fattime (void);
+#endif
+
+/* Unicode support functions */
+#if _USE_LFN != 0						/* Unicode - OEM code conversion */
+WCHAR ff_convert (WCHAR chr, UINT dir);	/* OEM-Unicode bidirectional conversion */
+WCHAR ff_wtoupper (WCHAR chr);			/* Unicode upper-case conversion */
+#if _USE_LFN == 3						/* Memory functions */
+void* ff_memalloc (UINT msize);			/* Allocate memory block */
+void ff_memfree (void* mblock);			/* Free memory block */
+#endif
+#endif
+
+/* Sync functions */
+#if _FS_REENTRANT
+int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj);	/* Create a sync object */
+int ff_req_grant (_SYNC_t sobj);				/* Lock sync object */
+void ff_rel_grant (_SYNC_t sobj);				/* Unlock sync object */
+int ff_del_syncobj (_SYNC_t sobj);				/* Delete a sync object */
+#endif
+
+
+
+
+/*--------------------------------------------------------------*/
+/* Flags and offset address                                     */
+
+
+/* File access mode and open method flags (3rd argument of f_open) */
+#define	FA_READ				0x01
+#define	FA_WRITE			0x02
+#define	FA_OPEN_EXISTING	0x00
+#define	FA_CREATE_NEW		0x04
+#define	FA_CREATE_ALWAYS	0x08
+#define	FA_OPEN_ALWAYS		0x10
+#define	FA_OPEN_APPEND		0x30
+
+/* Fast seek controls (2nd argument of f_lseek) */
+#define CREATE_LINKMAP	((FSIZE_t)0 - 1)
+
+/* Format options (2nd argument of f_mkfs) */
+#define FM_FAT		0x01
+#define FM_FAT32	0x02
+#define FM_EXFAT	0x04
+#define FM_ANY		0x07
+#define FM_SFD		0x08
+
+/* Filesystem type (FATFS.fs_type) */
+#define FS_FAT12	1
+#define FS_FAT16	2
+#define FS_FAT32	3
+#define FS_EXFAT	4
+
+/* File attribute bits for directory entry (FILINFO.fattrib) */
+#define	AM_RDO	0x01	/* Read only */
+#define	AM_HID	0x02	/* Hidden */
+#define	AM_SYS	0x04	/* System */
+#define AM_DIR	0x10	/* Directory */
+#define AM_ARC	0x20	/* Archive */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FATFS */

+ 122 - 0
Middlewares/Third_Party/FatFs/src/ff_gen_drv.c

@@ -0,0 +1,122 @@
+/**
+  ******************************************************************************
+  * @file    ff_gen_drv.c
+  * @author  MCD Application Team
+  * @brief   FatFs generic low level driver.
+  *****************************************************************************
+  * @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
+  *
+  ******************************************************************************
+**/
+/* Includes ------------------------------------------------------------------*/
+#include "ff_gen_drv.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+Disk_drvTypeDef disk = {{0},{0},{0},0};
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+  * @brief  Links a compatible diskio driver/lun id and increments the number of active
+  *         linked drivers.
+  * @note   The number of linked drivers (volumes) is up to 10 due to FatFs limits.
+  * @param  drv: pointer to the disk IO Driver structure
+  * @param  path: pointer to the logical drive path
+  * @param  lun : only used for USB Key Disk to add multi-lun management
+            else the parameter must be equal to 0
+  * @retval Returns 0 in case of success, otherwise 1.
+  */
+uint8_t FATFS_LinkDriverEx(const Diskio_drvTypeDef *drv, char *path, uint8_t lun)
+{
+  uint8_t ret = 1;
+  uint8_t DiskNum = 0;
+
+  if(disk.nbr < _VOLUMES)
+  {
+    disk.is_initialized[disk.nbr] = 0;
+    disk.drv[disk.nbr] = drv;
+    disk.lun[disk.nbr] = lun;
+    DiskNum = disk.nbr++;
+    path[0] = DiskNum + '0';
+    path[1] = ':';
+    path[2] = '/';
+    path[3] = 0;
+    ret = 0;
+  }
+
+  return ret;
+}
+
+/**
+  * @brief  Links a compatible diskio driver and increments the number of active
+  *         linked drivers.
+  * @note   The number of linked drivers (volumes) is up to 10 due to FatFs limits
+  * @param  drv: pointer to the disk IO Driver structure
+  * @param  path: pointer to the logical drive path
+  * @retval Returns 0 in case of success, otherwise 1.
+  */
+uint8_t FATFS_LinkDriver(const Diskio_drvTypeDef *drv, char *path)
+{
+  return FATFS_LinkDriverEx(drv, path, 0);
+}
+
+/**
+  * @brief  Unlinks a diskio driver and decrements the number of active linked
+  *         drivers.
+  * @param  path: pointer to the logical drive path
+  * @param  lun : not used
+  * @retval Returns 0 in case of success, otherwise 1.
+  */
+uint8_t FATFS_UnLinkDriverEx(char *path, uint8_t lun)
+{
+  uint8_t DiskNum = 0;
+  uint8_t ret = 1;
+
+  if(disk.nbr >= 1)
+  {
+    DiskNum = path[0] - '0';
+    if(disk.drv[DiskNum] != 0)
+    {
+      disk.drv[DiskNum] = 0;
+      disk.lun[DiskNum] = 0;
+      disk.nbr--;
+      ret = 0;
+    }
+  }
+
+  return ret;
+}
+
+/**
+  * @brief  Unlinks a diskio driver and decrements the number of active linked
+  *         drivers.
+  * @param  path: pointer to the logical drive path
+  * @retval Returns 0 in case of success, otherwise 1.
+  */
+uint8_t FATFS_UnLinkDriver(char *path)
+{
+  return FATFS_UnLinkDriverEx(path, 0);
+}
+
+/**
+  * @brief  Gets number of linked drivers to the FatFs module.
+  * @param  None
+  * @retval Number of attached drivers.
+  */
+uint8_t FATFS_GetAttachedDriversNbr(void)
+{
+  return disk.nbr;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+

+ 80 - 0
Middlewares/Third_Party/FatFs/src/ff_gen_drv.h

@@ -0,0 +1,80 @@
+/**
+  ******************************************************************************
+  * @file    ff_gen_drv.h
+  * @author  MCD Application Team
+  * @brief   Header for ff_gen_drv.c module.
+  *****************************************************************************
+  * @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
+  *
+  ******************************************************************************
+**/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __FF_GEN_DRV_H
+#define __FF_GEN_DRV_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "diskio.h"
+#include "ff.h"
+#include "stdint.h"
+
+
+/* Exported types ------------------------------------------------------------*/
+
+/**
+  * @brief  Disk IO Driver structure definition
+  */
+typedef struct
+{
+  DSTATUS (*disk_initialize) (BYTE);                     /*!< Initialize Disk Drive                     */
+  DSTATUS (*disk_status)     (BYTE);                     /*!< Get Disk Status                           */
+  DRESULT (*disk_read)       (BYTE, BYTE*, DWORD, UINT);       /*!< Read Sector(s)                            */
+#if _USE_WRITE == 1
+  DRESULT (*disk_write)      (BYTE, const BYTE*, DWORD, UINT); /*!< Write Sector(s) when _USE_WRITE = 0       */
+#endif /* _USE_WRITE == 1 */
+#if _USE_IOCTL == 1
+  DRESULT (*disk_ioctl)      (BYTE, BYTE, void*);              /*!< I/O control operation when _USE_IOCTL = 1 */
+#endif /* _USE_IOCTL == 1 */
+
+}Diskio_drvTypeDef;
+
+/**
+  * @brief  Global Disk IO Drivers structure definition
+  */
+typedef struct
+{
+  uint8_t                 is_initialized[_VOLUMES];
+  const Diskio_drvTypeDef *drv[_VOLUMES];
+  uint8_t                 lun[_VOLUMES];
+  volatile uint8_t        nbr;
+
+}Disk_drvTypeDef;
+
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+uint8_t FATFS_LinkDriver(const Diskio_drvTypeDef *drv, char *path);
+uint8_t FATFS_UnLinkDriver(char *path);
+uint8_t FATFS_LinkDriverEx(const Diskio_drvTypeDef *drv, char *path, BYTE lun);
+uint8_t FATFS_UnLinkDriverEx(char *path, BYTE lun);
+uint8_t FATFS_GetAttachedDriversNbr(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __FF_GEN_DRV_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+

+ 341 - 0
Middlewares/Third_Party/FatFs/src/ffconf_template.h

@@ -0,0 +1,341 @@
+/*----------------------------------------------------------------------------/
+/  FatFs - Generic FAT file system module  R0.12c                             /
+/-----------------------------------------------------------------------------/
+/
+/ Copyright (C) 2017, ChaN, all right reserved.
+/ Portions Copyright (C) STMicroelectronics, all right reserved.
+/
+/ FatFs module is an open source software. Redistribution and use of FatFs in
+/ source and binary forms, with or without modification, are permitted provided
+/ that the following condition is met:
+
+/ 1. Redistributions of source code must retain the above copyright notice,
+/    this condition and the following disclaimer.
+/
+/ This software is provided by the copyright holder and contributors "AS IS"
+/ and any warranties related to this software are DISCLAIMED.
+/ The copyright owner or contributors be NOT LIABLE for any damages caused
+/ by use of this software.
+/----------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------/
+/  FatFs - FAT file system module configuration file
+/---------------------------------------------------------------------------*/
+
+#define _FFCONF 68300	/* Revision ID */
+
+/*---------------------------------------------------------------------------/
+/ Function Configurations
+/---------------------------------------------------------------------------*/
+
+#define _FS_READONLY	0
+/* 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
+/* 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	0
+/* 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 function. (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	3
+#define	_MAX_LFN	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
+/* 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
+/* 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	2
+/* Number of volumes (logical drives) to be used. */
+
+
+#define _STR_VOLUME_ID	0
+#define _VOLUME_STRS	"RAM","NAND","CF","SD","SD2","USB","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. */
+
+
+#define	_MULTI_PARTITION	0
+/* 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
+#define	_MAX_SS		512
+/* 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
+/* 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
+/* 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	1
+#define _NORTC_MDAY	1
+#define _NORTC_YEAR	2016
+/* 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
+/* 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	0
+#define _USE_MUTEX	0
+/* Use CMSIS-OS mutexes as _SYNC_t object instead of Semaphores */
+
+#if _FS_REENTRANT
+
+#include "cmsis_os.h"
+#define _FS_TIMEOUT		1000
+
+#if _USE_MUTEX
+
+#if (osCMSIS < 0x20000U)
+#define _SYNC_t         osMutexId
+#else
+#define _SYNC_t         osMutexId_t
+#endif
+
+#else
+#if (osCMSIS < 0x20000U)
+#define _SYNC_t         osSemaphoreId
+#else
+#define	_SYNC_t         osSemaphoreId_t
+#endif
+
+#endif
+#endif //_FS_REENTRANT
+/* 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. */
+
+/* #include <windows.h>	// O/S definitions  */
+
+#if _USE_LFN == 3
+
+#if !defined(ff_malloc) || !defined(ff_free)
+#include <stdlib.h>
+#endif
+
+#if !defined(ff_malloc)
+#define ff_malloc malloc
+#endif
+
+#if !defined(ff_free)
+#define ff_free free
+#endif
+
+/* by default the system malloc/free are used, but when the FreeRTOS is enabled
+/ the macros pvPortMalloc()/vportFree() to be used thus uncomment the code below
+/
+*/
+/*
+#if !defined(ff_malloc) || !defined(ff_free)
+#include "cmsis_os.h"
+#endif
+
+#if !defined(ff_malloc)
+#define ff_malloc pvPortMalloc
+#endif
+
+#if !defined(ff_free)
+#define ff_free vPortFree
+#endif
+*/
+#endif
+/*--- End of configuration options ---*/

+ 38 - 0
Middlewares/Third_Party/FatFs/src/integer.h

@@ -0,0 +1,38 @@
+/*-------------------------------------------*/
+/* Integer type definitions for FatFs module */
+/*-------------------------------------------*/
+
+#ifndef _FF_INTEGER
+#define _FF_INTEGER
+
+#ifdef _WIN32	/* FatFs development platform */
+
+#include <windows.h>
+#include <tchar.h>
+typedef unsigned __int64 QWORD;
+
+
+#else			/* Embedded platform */
+
+/* These types MUST be 16-bit or 32-bit */
+typedef int				INT;
+typedef unsigned int	UINT;
+
+/* This type MUST be 8-bit */
+typedef unsigned char	BYTE;
+
+/* These types MUST be 16-bit */
+typedef short			SHORT;
+typedef unsigned short	WORD;
+typedef unsigned short	WCHAR;
+
+/* These types MUST be 32-bit */
+typedef long			LONG;
+typedef unsigned long	DWORD;
+
+/* This type MUST be 64-bit (Remove this for ANSI C (C89) compatibility) */
+typedef unsigned long long QWORD;
+
+#endif
+
+#endif

Разлика између датотеке није приказан због своје велике величине
+ 3870 - 0
Middlewares/Third_Party/FatFs/src/option/cc932.c


Разлика између датотеке није приказан због своје велике величине
+ 11045 - 0
Middlewares/Third_Party/FatFs/src/option/cc936.c


Разлика између датотеке није приказан због своје велике величине
+ 8674 - 0
Middlewares/Third_Party/FatFs/src/option/cc949.c


Разлика између датотеке није приказан због своје велике величине
+ 6900 - 0
Middlewares/Third_Party/FatFs/src/option/cc950.c


Разлика између датотеке није приказан због своје велике величине
+ 388 - 0
Middlewares/Third_Party/FatFs/src/option/ccsbcs.c


+ 177 - 0
Middlewares/Third_Party/FatFs/src/option/syscall.c

@@ -0,0 +1,177 @@
+/*------------------------------------------------------------------------*/
+/* 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 "../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;
+#if _USE_MUTEX
+
+#if (osCMSIS < 0x20000U)
+    osMutexDef(MTX);
+    *sobj = osMutexCreate(osMutex(MTX));
+#else
+    *sobj = osMutexNew(NULL);
+#endif
+
+#else
+
+#if (osCMSIS < 0x20000U)
+    osSemaphoreDef(SEM);
+    *sobj = osSemaphoreCreate(osSemaphore(SEM), 1);
+#else
+    *sobj = osSemaphoreNew(1, 1, NULL);
+#endif
+
+#endif
+    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 */
+)
+{
+#if _USE_MUTEX
+    osMutexDelete (sobj);
+#else
+    osSemaphoreDelete (sobj);
+#endif
+    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 (osCMSIS < 0x20000U)
+
+#if _USE_MUTEX
+  if(osMutexWait(sobj, _FS_TIMEOUT) == osOK)
+#else
+  if(osSemaphoreWait(sobj, _FS_TIMEOUT) == osOK)
+#endif
+
+#else
+
+#if _USE_MUTEX
+   if(osMutexAcquire(sobj, _FS_TIMEOUT) == osOK)
+#else
+   if(osSemaphoreAcquire(sobj, _FS_TIMEOUT) == osOK)
+#endif
+
+#endif
+  {
+    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 */
+)
+{
+#if _USE_MUTEX
+  osMutexRelease(sobj);
+#else
+  osSemaphoreRelease(sobj);
+#endif
+}
+
+#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

+ 17 - 0
Middlewares/Third_Party/FatFs/src/option/unicode.c

@@ -0,0 +1,17 @@
+#include "../ff.h"
+
+#if _USE_LFN != 0
+
+#if   _CODE_PAGE == 932	/* Japanese Shift_JIS */
+#include "cc932.c"
+#elif _CODE_PAGE == 936	/* Simplified Chinese GBK */
+#include "cc936.c"
+#elif _CODE_PAGE == 949	/* Korean */
+#include "cc949.c"
+#elif _CODE_PAGE == 950	/* Traditional Chinese Big5 */
+#include "cc950.c"
+#else					/* Single Byte Character-Set */
+#include "ccsbcs.c"
+#endif
+
+#endif

+ 221 - 0
Middlewares/Third_Party/FatFs/src/st_readme.txt

@@ -0,0 +1,221 @@
+  @verbatim
+  ******************************************************************************
+  * @file    st_readme.txt
+  * @author  MCD Application Team
+  * @brief   This file lists the main modification done by STMicroelectronics on
+  *          FatFs for integration with STM32Cube solution.
+  *          For more details on FatFs implementation on STM32Cube, please refer
+  *          to UM1721 "Developing Applications on STM32Cube with FatFs"
+  ******************************************************************************
+  * @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
+  *
+  ******************************************************************************
+  @endverbatim
+
+### V2.1.4/18-10-2019 ###
+============================
++ Fix wrong usage of the "memcpy" in the SD_Write() function
+  - drivers/sd_diskio_dma_template_bspv1.c
+  - drivers/sd_diskio_dma_template_bspv2.c
+  - drivers/sd_diskio_dma_rtos_template_bspv1.c
+  - drivers/sd_diskio_dma_rtos_template_bspv2.c
+
++ correct the usage of the "_USE_MUTEX" config flag
+  - syscall.c
+
+### V2.1.3/26-07-2019 ###
+============================
++ add new BSPv2 templates:
+  - drivers/sd_diskio_dma_rtos_template_bspv2.c
+  - drivers/sd_diskio_dma_template_bspv2.c
+  - drivers/sd_diskio_template_bspv2.c
+  - drivers/sdram_diskio_template_bspv2.c
+
++ rename old template to "xxxx_diskio_template_bspv1.c":
+  - drivers/sd_diskio_dma_rtos_template_bspv1.c
+  - drivers/sd_diskio_dma_template_bspv1.c
+  - drivers/sd_diskio_template_bspv1.c
+  - drivers/sdram_diskio_template_bspv1.c
+
++ Add CMSIS-OSv2 support in templates, syscall.c and ff_conf_template.h
+  - syscall.c
+  - ff_conf_template.h
+  - drivers/sd_diskio_dma_rtos_template_bspv2.c
+
++ support usage of "osMutex" alongside "osSemaphore" as _SYNC_t type in fatfs
+  - syscall.c
+  - ff_conf_template.h
+
+
+### V2.1.2/29-03-2019 ###
+============================
++ add st_license.txt in the root directory
++ src/drivers/xxx_diskio_template.[c/h], src/ff_gen_drv.[c/h], src/option/syscall.c: update the license terms to BSD-3-Clause
+
+### V2.1.1/25-01-2019 ###
+============================
++ sd_diskio_dma_rtos_template.c
+  - Fix memory leak in the SD_Initialize()
+  - Disable the ENABLE_SD_DMA_CACHE_MAINTENANCE flag by default to fix a build error for CM4
+  - include correct diskio header file
+
++ sd_diskio_dma_template.c
+  - Correct the SD_read() function when enabling the ENABLE_SCRATCH_BUFFER flag
+
++ sd_diskio_dma_rtos_template.c sd_diskio_dma_template.c
+  - fix potential overflow when using SysTick.
+
+
+### V2.1.0/21-09-2018 ###
+============================
++ ff.c
+  - back-port a fix from 0.13, to correct an issue when using multi-threading
+    access in the same device due to a missing semaphore lock when calling
+    disk_status() API.
+
++ sd_diskio_dma_rtos_template.c
+  - Add support to CMSIS-RTOS V2 API
+
++ sd_diskio_dma_rtos_template.c sd_diskio_dma_template.c
+  - Add a compile flag "ENABLE_SCRATCH_BUFFER" to avoid misaligned access
+    caused buffer alignment constraint in some DMA versions.
+  - Add BSP_SD_ErrorCallback() and BSP_SD_AbortCallback() template functions.
+
+### V2.0.2/17-November-2017 ###
+============================
++ sdram_diskio_template.c  sram_diskio_template.c
+   Fix wrong buffer size in the (SRAM/SDRAM)DISK_read(), (SRAM/SDRAM)DISK_write()
+
++ sd_diskio_template.c
+  - define a generic 'SD_TIMEOUT' based on the BSP drivers defines. This fixes
+    a build issue when using this driver with the Adafruit shield.
+
++ sd_diskio_dma_rtos_template.c
+  - add a check via  osKernelRunning(), to avoid runtime errors due to
+    osMessageXXX calls that needs the "osKernelStart()" call done first.
+
++ sd_diskio_dma_template.c, sd_diskio_dma_rtos_template.c
+  - fix wrong address alignment when calling SCB_InvalidateDCache_by_Addr() and
+    SCB_CleanDCache_by_Addr(), the address has to be 32-Byte and not
+    32-bit aligned.
+
+  - fix BSP_SD_ReadCpltCallback() and BSP_SD_WriteCpltCallback() prototypes by
+    adding 'void' as argument to avoid IAR compiler errors
+
+
++ sd_diskio_template.c sd_diskio_dma_template.c, sd_diskio_dma_rtos_template.c
+  - add the  flag "DISABLE_SD_INIT" to give the user the choice to initialize the SD
+    either in the application or in the FatFs diskio driver.
+
++ all xxx_diskio_template.c
+  - fix GET_BLOCK_SIZE ioctl call; the return value is in unit of sectors.
+
+
+### V2.0.1/10-July-2017 ###
+============================
++ sd_diskio_dma_template.c, sd_diskio_dma_rtos_template.c
+  - add the  flag "ENABLE_SD_DMA_CACHE_MAINTENANCE", to enable cache maintenance  at each read write operation.
+    This is useful for STM32F7/STM32H7 based platforms when using a cachable memory region.
+  - add timeout checks in SD_Read() and SD_Write() to give the control back to the application to decide in case of errors.
+
++ ff_gen_drv.c: fix a wrong check that causes an out of bound array access.
+
+
+### V2.0.0/07-March-2017 ###
+============================
+  + Upgrade to use FatFS R0.12c. The R0.12c breaks the API compatibility with R0.11b.
+  - f_mkfs() API has a new signature.
+  - The _CODE_PAGE got new values.
+  - For more details check the files (doc/updates.txt) and the following urls:
+       http://elm-chan.org/fsw/ff/en/mkfs.html
+       http://elm-chan.org/fsw/ff/en/config.html
+
+  + Add USB, RAMDISK and uSD template drivers under src/drivers.
+    - The diskio drivers aren't part of fatfs anymore, they are just templates instead.
+    - User has to copy the suitable template .c/.h file under the project, rename them by
+      removing the "_template" suffix then link them into the final application.
+    - The diskio driver .c/.h files have to be edited according to the used platform.
+
+  + Define the macros "ff_malloc" and "ff_free" in the ff_conf_template.h and use
+    them in the syscall.c instead of direct calls to stdlib malloc and free functions.
+  + Define the "__weak" attribute in diskio.c for the GNU GCC compiler
+
+
+### V1.4.0/09-September-2016 ###
+================================
+  + Upgrade to use FatFs R0.12b.
+  + ff_conf.h: remove the use of define "_USE_BUFF_WO_ALIGNMENT".
+
+
+### V1.3.0/08-May-2015 ###
+==========================
+  + Upgrade to use FatFs R0.11.
+  + Add new APIs FATFS_LinkDriverEx() and FATFS_UnLinkDriverEx() to manage USB Key Disk having
+     multi-lun capability. These APIs are equivalent to FATFS_LinkDriver() and FATFS_UnLinkDriver()
+     with "lun" parameter set to 0.
+  + ff_conf.h: add new define "_USE_BUFF_WO_ALIGNMENT".
+     This option is available only for usbh diskio interface and allow to disable
+     the management of the unaligned buffer.
+     When STM32 USB OTG HS or FS IP is used with internal DMA enabled, this define
+     must be set to 0 to align data into 32bits through an internal scratch buffer
+     before being processed by the DMA . Otherwise (DMA not used), this define must
+     be set to 1 to avoid Data alignment and improve the performance.
+     Please note that if _USE_BUFF_WO_ALIGNMENT is set to 1 and an unaligned 32bits
+     buffer is forwarded to the FatFs Write/Read functions, an error will be returned.
+     (0: default value or 1: unaligned buffer return an error).
+
+
+  + Important note:
+      For application code based on previous FatFs version; when moving to R0.11
+      the changes that need to be done is to update ffconf.h file, taking
+      ffconf_template.h file as reference.
+
+
+### V1.2.1/20-November-2014 ###
+===============================
+  + Disk I/O drivers; change count argument type from BYTE to UINT
+
+  + Important note:
+      For application code based on previous FatFs version; when moving to R0.10b
+      the only change that need to be done is to update ffconf.h file, taking
+      ffconf_template.h file as reference.
+
+
+### V1.2.0/04-November-2014 ###
+===============================
+  + Upgrade to use FatFs R0.10b.
+  + diskio.c: update disk_read() and disk_write() argument's type.
+
+  + Important note:
+      For application code based on previous FatFs version; when moving to R0.10b
+      the only change that need to be done is to update ffconf.h file, taking
+      ffconf_template.h file as reference.
+
+
+### V1.1.1/12-September-2014 ###
+================================
+  + ff_gen_drv.c: Update the Disk_drvTypeDef disk variable initialization to avoid
+    warnings detected with Atollic TrueSTUDIO Complier.
+
+
+### V1.1.0/22-April-2014 ###
+============================
+  + Update sd_diskio to use SD BSP in polling mode instead of DMA mode (the scratch
+    buffer needed for DMA alignment is removed as well).
+  + diskio.c and ff_gen_drv.c/.h: update to prevent multiple initialization.
+
+
+### V1.0.0/18-February-2014 ###
+===============================
+   + First R0.10 customized version for STM32Cube solution.
+
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */

+ 841 - 0
Src/TerminalSlave485_jt808.c

@@ -0,0 +1,841 @@
+/*********************************************************
+//file		:hd_dev_gpio.c
+//author	:boly
+//date		:2021/10/21
+//version	:V1.0
+//brief		:GSP HARD层GPIO接口C文件
+*********************************************************/
+/* Includes-----------------------------------------------------------------------------------*/
+
+#define  APP_TERMINALSLAVE485_JT808_USE
+
+#ifdef APP_TERMINALSLAVE485_JT808_USE
+/* Includes-----------------------------------------------------------------------------------*/
+#include "TerminalSlave485.h"
+#include "TerminalSlave485_jt808.h"
+#include "CollectMaster485.h"
+#include "ScreenMaster485.h"
+#include "KeySlave485.h"
+#include "Elec_Seal.h"
+#include "usart.h"	
+#include "Data_deal.h"
+#include "Randomcode.h"
+#include "spi.h"
+#include "Dwin.h"
+#include "DS1302.h"
+#include "leaf_ota.h"
+#include "md5c.h"
+#include "cmsis_os.h"
+#include "func_ram_record.h"
+/* Private macro------------------------------------------------------------------------------*/
+/* Private typedef----------------------------------------------------------------------------*/
+typedef struct SEND_DATA_UNIT_STC
+{
+	uint32_t flowID;								//发送数据ID
+	uint32_t lenth;									//发送数据长度
+	uint32_t send_cnt;							//发送计数器	
+	uint8_t  buf[DATA_UNIT_SIZE - sizeof(uint32_t)*3]; 	//发送数据缓冲区
+}SEND_DATA_UNIT_STC;
+
+
+typedef struct JT808_DATA_OBJ
+{
+	uint32_t flowID;  					//Y为32Bit的流水号-高位在前,此流水号来源于控制板主动上报的传感器数据包内,如A1封装
+	uint32_t back_cnt;					//接收超时计数
+	uint32_t link_cnt;					//连接计数器
+	uint32_t link_ok;						//连接标志位
+	
+	SEND_DATA_UNIT_STC send_data;
+}JT808_DATA_OBJ; 
+
+/* Private define-----------------------------------------------------------------------------*/
+/* Private variables--------------------------------------------------------------------------*/
+Pass41SensorScanParam_TypeDef Pass41SensorScanParam; 
+JT808_DATA_OBJ jt808_obj = {
+	.flowID 					= 1,
+	.back_cnt					= 0,		//接收超时计数
+	.link_cnt					= 0,	
+	.link_ok					= 0,	
+	
+	.send_data.flowID		= 0,
+	.send_data.lenth		= 0,
+	.send_data.buf			= {0},
+
+};
+
+extern uint8_t  Cang_IO_tbak[4][64];
+extern uint32_t overflow_cnt_bak;
+extern unsigned char overflow_flag_bak;
+extern uint8_t  Cang01_IO[64];
+extern uint8_t  Cang02_IO[64];
+extern uint8_t  Cang03_IO[64];
+extern uint8_t  Cang04_IO[64];
+extern uint8_t  Cang05_IO[64];
+extern uint8_t  Cang06_IO[64];
+extern uint8_t  Cang07_IO[64];
+extern uint8_t  Cang08_IO[64];
+extern uint32_t overflow_cnt;
+/* Private function prototypes----------------------------------------------------------------*/
+int jt808_Build_0x02_TimeCmd(uint8_t *pBuf);
+int jt808_Build_0x01_flowID(uint8_t *pBuf, uint32_t flow_id);
+
+int jt808_Build_0x61_ManHole_Big_SW(uint8_t *pBuf);
+int jt808_Build_0x62_ManHole_Small_SW(uint8_t *pBuf);
+int jt808_Build_0x63_Dump_info(uint8_t *pBuf);
+int jt808_Build_0x64_HaiDiFa(uint8_t *pBuf);	
+int jt808_Build_0x6d_Cang_info(uint8_t *pBuf);
+int jt808_Build_0x70_Sealing(uint8_t *pBuf);
+int jt808_Build_0x71_DumpBox_info(uint8_t *pBuf);
+int jt808_Build_0x72_ManHole_Box_info(uint8_t *pBuf);
+
+void jt808_update_0x40_data(void);
+int jt808_BuildSealTxCmd(uint8_t *pBuf, uint8_t *pEmergencyflag); // 40命令
+
+void mem_swap(uint8_t *des,int len)
+{
+	int i,tlen;
+	uint8_t dat;
+	tlen = (len>>1);
+	len--;
+	for(i=0;i<tlen;i++)
+	{
+		dat = des[i];
+		des[i] = des[len-i];
+		des[len-i]=dat;
+	}
+	return;
+}
+
+/**
+ ***************************************
+ * 构建A1命令数据 -- hex制式
+ * 输入:
+ *    pBuf-构建数据的存放首地址
+ *    pEmergy,如果是数据有变动,表示紧急上报,将标记存于此地址
+ *    flowID, 流水id值
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_A1_Cmd(uint8_t *pBuf, uint32_t flowID, uint8_t *pEmergencyflag)
+{
+	int send_pos=0;
+	unsigned char emergencyflag=0;
+	unsigned char Lrc_temp;
+	unsigned char overflow_flag=0;
+	unsigned char temp_i = 0x00;
+	
+	UNUSED(Lrc_temp);
+	UNUSED(temp_i);
+	jt808_update_0x40_data();
+	//标识头	总长度	紧急上报位	数据状态	仓数
+	pBuf[send_pos++] = 0xA1;
+	pBuf[send_pos++] = 120;
+	if(StoreNumber>0)
+	{
+		if(memcmp(Cang_IO_tbak[0],Cang01_IO,64))
+		{
+			emergencyflag=0x80;
+		}
+		memcpy(Cang_IO_tbak[0],Cang01_IO,64);
+	}
+	if(StoreNumber>1)
+	{
+		if(memcmp(Cang_IO_tbak[1],Cang02_IO,64))
+		{
+			emergencyflag=0x80;
+		}
+		memcpy(Cang_IO_tbak[1],Cang02_IO,64);
+	}
+	if(StoreNumber>2)
+	{
+		if(memcmp(Cang_IO_tbak[2],Cang03_IO,64))
+		{
+			emergencyflag=0x80;
+		}
+		memcpy(Cang_IO_tbak[2],Cang03_IO,64);
+	}
+	if(StoreNumber>3)
+	{
+		if(memcmp(Cang_IO_tbak[3],Cang04_IO,64))
+		{
+			emergencyflag=0x80;
+		}
+		memcpy(Cang_IO_tbak[3],Cang04_IO,64);
+	}
+	
+	if(StoreNumber > 4)
+	{
+		StoreNumber = 4;
+	}
+	
+	if((overflow_cnt==0) && (overflow_cnt==overflow_cnt_bak))
+	{
+		overflow_flag=0;
+	}
+	else
+	{
+		overflow_flag=1;
+	}
+	
+	overflow_cnt_bak=overflow_cnt;
+	if(overflow_flag_bak!=overflow_flag)
+	{
+		emergencyflag=0x80;	
+	}
+	overflow_flag_bak=overflow_flag;
+
+	pBuf[send_pos++] = emergencyflag; //紧急上报位	
+	pBuf[send_pos++] = 0x00; 					//数据状态:00正常;01未收到数据;02乱码
+	pBuf[send_pos++] = StoreNumber;
+	pBuf[send_pos++] = 0x22;
+	pBuf[send_pos++] = overflow_flag;
+	
+	//61	人孔大盖	开关
+	send_pos += jt808_Build_0x61_ManHole_Big_SW((uint8_t *)pBuf+send_pos);
+	
+	//62	人孔小盖	开关
+	send_pos += jt808_Build_0x62_ManHole_Small_SW((uint8_t *)pBuf+send_pos);
+	
+	//63	卸油阀	开关
+	send_pos += jt808_Build_0x63_Dump_info((uint8_t *)pBuf+send_pos);
+	
+	//64	底阀	开关
+	send_pos += jt808_Build_0x64_HaiDiFa((uint8_t *)pBuf+send_pos);
+
+	//6D	仓状态	
+	send_pos += jt808_Build_0x6d_Cang_info((uint8_t *)pBuf+send_pos);	
+	
+	//70	铅封状态
+	send_pos += jt808_Build_0x70_Sealing((uint8_t *)pBuf+send_pos);		
+	
+	//71	卸油箱门	开关
+	send_pos += jt808_Build_0x71_DumpBox_info((uint8_t *)pBuf+send_pos);
+	
+	//72	人孔箱护罩	开关
+	send_pos += jt808_Build_0x72_ManHole_Box_info((uint8_t *)pBuf+send_pos);	
+	
+	//01	流水号	4字节	整数
+	send_pos += jt808_Build_0x01_flowID((uint8_t *)pBuf+send_pos, flowID);
+	
+	//02	时间戳	6字节	字符串	BCD[6]	YY-MM-DD-hh-mm-ss(GMT+8 时间,本标准中之后涉及的时间均采用此时区)
+	send_pos += jt808_Build_0x02_TimeCmd((uint8_t *)pBuf+send_pos);	
+	
+	//数据帧长度
+	pBuf[1] = send_pos-2;
+#if 0
+	while (send_pos<(120+2))
+	{
+		pBuf[send_pos++] = 0;
+	};
+#endif	
+	
+	if (pEmergencyflag) *pEmergencyflag = emergencyflag;
+	
+	return send_pos;
+}
+/**
+ ***************************************
+ * 更新老协议0x40系统状态
+ * 输入:void
+ * 返回: void
+ ***************************************
+ */
+uint8_t  	JT808_0x40_buf[256]={0};//大小+1  136
+uint8_t 	JT808_0x40_len = 0;
+void jt808_update_0x40_data(void)
+{
+	uint8_t JT808_emergencyflag = 0;
+	JT808_0x40_len = jt808_BuildSealTxCmd(JT808_0x40_buf, &JT808_emergencyflag);
+	
+	return;
+}
+
+
+/**
+ ***************************************
+ * 构建6D	仓状态	
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x6d_Cang_info(uint8_t *pBuf)
+{
+	int idx=0;
+	int i = 0;
+	
+	pBuf[idx++] = 0x6D; 										//类型
+	for (i = 0; i < StoreNumber; i++)
+	{
+		//pBuf[idx++] = 1;											//每仓数量			
+		//Sealing_Data.Sealing_state_oiltype[i] :仓状态与油品:
+		//Sealing_Data.Sealing_state_oiltype[i] = (Byte_high<<4)|Byte_low;
+		//高4位值1:装油,2:有油,3:卸油,4:空仓(无油),低4位代表油品,高四位非等于4(空仓)值默认1,否则为0;
+		pBuf[idx++] = (Sealing_Data.Sealing_state_oiltype[i] &0xf0)>> 4;
+		
+	}
+		
+	return idx;
+}
+/**
+ ***************************************
+ * 构建61	人孔大盖	开关状态
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x61_ManHole_Big_SW(uint8_t *pBuf)
+{
+	int idx=0;
+	int i,j;
+	
+	if(((Config_info_all.ManHole_Big_info/StoreNumber) == 0)
+		||((Config_info_all.ManHole_Big_info&0x80)==0x80))
+	{		
+		return 0;
+	}
+	
+	pBuf[idx++] = 0x61;
+	for (i = 0; i < StoreNumber; i++)
+	{
+		pBuf[idx++] = Config_info_all.ManHole_Big_info/StoreNumber;
+		for(j=0;j<Config_info_all.ManHole_Big_info/StoreNumber;++j)
+		{
+			pBuf[idx++] = Cang_IO_tbak[i][indexDaGai01+10*j];
+		}
+	}
+		
+	return idx;
+}
+/**
+ ***************************************
+ * 构建62	人孔小盖	开关状态
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x62_ManHole_Small_SW(uint8_t *pBuf)
+{
+	int idx=0;
+	int i,j;
+	if(((Config_info_all.ManHole_small_info/StoreNumber) == 0)
+		||((Config_info_all.ManHole_small_info&0x80)==0x80))
+	{		
+		return 0;
+	}
+	
+	pBuf[idx++] = 0x62;
+	for (i = 0; i < StoreNumber; i++)
+	{
+		pBuf[idx++] = Config_info_all.ManHole_small_info/StoreNumber;
+		for(j=0;j<Config_info_all.ManHole_small_info/StoreNumber;++j)
+		{
+			pBuf[idx++] = Cang_IO_tbak[i][indexXiaoGai01+10*j];
+		}
+	}
+		
+	return idx;
+}
+
+/**
+ ***************************************
+ * 构建63	卸油阀	开关
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x63_Dump_info(uint8_t *pBuf)
+{
+	int idx=0;
+	int i,j;
+	
+	if(((Config_info_all.Dump_info/StoreNumber) == 0)
+		||((Config_info_all.Dump_info&0x80)==0x80))
+	{		
+		return 0;
+	}
+	
+	pBuf[idx++] = 0x63;
+	for (i = 0; i < StoreNumber; i++)
+	{
+		pBuf[idx++] = Config_info_all.Dump_info/StoreNumber;
+		for(j=0;j<Config_info_all.Dump_info/StoreNumber;++j)
+		{
+			pBuf[idx++] = Cang_IO_tbak[i][indexXieYouFa01+10*j];
+		}
+	}
+		
+	return idx;
+}
+
+/**
+ ***************************************
+ * 构建72	人孔箱护罩	开关
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x72_ManHole_Box_info(uint8_t *pBuf)
+{
+	int idx=0;
+	int i,j;
+		
+	if(((Config_info_all.ManHole_Big_info/StoreNumber) == 0)
+	||((Config_info_all.ManHole_Big_info&0x80)==0x80))
+	{		
+		return 0;
+	}
+	
+	pBuf[idx++] = 0x72;
+	for (i = 0; i < StoreNumber; i++)
+	{
+		pBuf[idx++] = Config_info_all.ManHole_Big_info/StoreNumber;
+		for(j=0;j<Config_info_all.ManHole_Big_info/StoreNumber;++j)
+		{
+			pBuf[idx++] = Cang_IO_tbak[i][indexDaGai01+10*j];
+		}
+	}
+		
+	return idx;
+}
+
+/**
+ ***************************************
+ * 构建71	卸油箱门	开关
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x71_DumpBox_info(uint8_t *pBuf)
+{
+	int idx=0;
+	int i,j;
+
+	if(((Config_info_all.Dump_info/StoreNumber) == 0)
+	 ||((Config_info_all.Dump_info&0x80)==0x80))
+	{		
+		return 0;
+	}
+	
+	pBuf[idx++] = 0x71;
+	for (i = 0; i < StoreNumber; i++)
+	{
+		pBuf[idx++] = Config_info_all.Dump_info/StoreNumber;
+		for(j=0;j<Config_info_all.Dump_info/StoreNumber;++j)
+		{
+			pBuf[idx++] = Cang_IO_tbak[i][indexXieYouFa01+10*j];
+		}
+	}
+		
+	return idx;
+}
+
+/**
+ ***************************************
+ * 构建64	底阀	开关		
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x64_HaiDiFa(uint8_t *pBuf)
+{
+	int idx=0;
+	int i,j;
+	if(((Config_info_all.HaiDiFa_info/StoreNumber) == 0)
+		||((Config_info_all.HaiDiFa_info&0x80)==0x80))
+	{		
+		return 0;
+	}
+	
+	pBuf[idx++] = 0x64;
+	for (i = 0; i < StoreNumber; i++)
+	{
+		pBuf[idx++] = Config_info_all.HaiDiFa_info/StoreNumber;
+		for(j=0;j<Config_info_all.HaiDiFa_info/StoreNumber;++j)
+		{
+			pBuf[idx++] = Cang_IO_tbak[i][indexHaiDiFa01+10*j];
+		}
+	}
+		
+	return idx;
+}
+/**
+ ***************************************
+ * 构建70	铅封状态		
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x70_Sealing(uint8_t *pBuf)
+{
+	int idx=0;
+	int i = 0;
+
+	pBuf[idx++] = 0x70; 										//类型
+	for (i = 0; i < StoreNumber; i++)
+	{
+		//pBuf[idx++] = 1;											//每仓数量			
+		//Sealing_Data.Sealing_Mode[i] :仓状态与油品:
+		//1仓铅封状态/装油模式:高4位值1: 施封状态,值2:解封状态,值3:破封状态,值4:施封并输入密码超限,值5:非法破封;
+		//										低4位(装油情况下)值1:上装,值2:下装;	
+		pBuf[idx++] = (Sealing_Data.Sealing_Mode[i] &0xf0)>> 4;		
+	}
+	
+	return idx;
+}
+
+
+/**
+ ***************************************
+ * 构建01	流水号	4字节	整数
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build_0x01_flowID(uint8_t *pBuf,uint32_t flow_id)
+{
+	int idx=0;
+	
+	// 2022-8-25, 新增加的子命令
+	// 01, 流水号
+	// 02, 时间戳
+	do {
+		pBuf[idx++] = 0x01;
+		pBuf[idx++] = (flow_id>>24) & 0xff;
+		pBuf[idx++] = (flow_id>>16) & 0xff;
+		pBuf[idx++] = (flow_id>>8) & 0xff;
+		pBuf[idx++] = (flow_id>>0) & 0xff;
+	}while(0);
+	
+	return idx;
+}
+/**
+ ***************************************
+ * 构建20命令数据       时间戳 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+extern SDateTime m_datetime;
+int jt808_Build_0x02_TimeCmd(uint8_t *pBuf)
+{
+	int send_pos=0;
+	
+	//02	时间戳	6字节	字符串	BCD[6]	YY-MM-DD-hh-mm-ss(GMT+8 时间,本标准中之后涉及的时间均采用此时区)							
+
+	pBuf[send_pos++] = 0x02;
+
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.year);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.month);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.day);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.hour);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.min);
+	pBuf[send_pos++] = HEXtoBCD(m_datetime.sec);
+	
+	return send_pos;
+}
+
+/**
+ ***************************************
+ * 构建40命令数据       电子铅封 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_BuildSealTxCmd(uint8_t *pBuf, uint8_t *pEmergencyflag) // 40命令
+{
+	Return_data *ret;
+	int n = 0;
+	uint8_t emergencyflag = 0;
+
+	*pBuf++ = 0x40;
+	ret = Seal_Tx_Readvalue(0,0);
+	*pBuf++ = ret->length/2; // 调用返回的数据是asii制式的,所以真实的hex数是其一半
+	
+	for(n=0; n < ret->length/2 && n < 100; n++) {
+		pBuf[n] = MODBUS_ASCII_AsciiToHex(ret->data + 2*n);
+	}
+
+	emergencyflag = pBuf[0];
+	if(pEmergencyflag) *pEmergencyflag = emergencyflag;
+	return n+2;
+}
+
+/**
+ ***************************************
+ * 构建91命令数据       IO状态 -- hex制式
+ * 输入:pBuf-构建数据的存放首地址
+ * 返回: 构建数据的字节总数
+ ***************************************
+ */
+int jt808_Build91Cmd(uint8_t *pBuf, uint8_t *pEmergencyflag) 
+{
+	Return_data *ret;
+	int n = 0;
+	uint8_t emergencyflag = 0;
+
+	*pBuf++ = 0x91;
+	ret = IO_Tx_Readvalue(0,0);
+	*pBuf++ = ret->length/2; // 调用返回的数据是asii制式的,所以真实的hex数是其一半
+	
+	for(n=0; n < ret->length/2 && n < 100; n++) {
+		pBuf[n] = MODBUS_ASCII_AsciiToHex(ret->data + 2*n);
+	}
+
+	emergencyflag = pBuf[0];
+	if(pEmergencyflag) *pEmergencyflag = emergencyflag;
+	return n+2;
+}
+
+/**
+ ***************************************
+ * 检测当前连接状态
+ * 输入:无
+ * 返回: 无
+ ***************************************
+ */
+void jt808_link_check(void)
+{
+		if(jt808_obj.back_cnt < (Pass41SensorScanParam.nstep*Pass41SensorScanParam.step))
+		{
+			 jt808_obj.link_cnt++;
+		}
+		else
+		{
+				jt808_obj.link_cnt = 0;
+		}
+		
+		if(jt808_obj.link_cnt > 5)
+		{
+			jt808_obj.link_ok = true; 
+		}
+		else
+		{
+			jt808_obj.link_ok = false; 
+		}
+		
+		return;
+}
+
+/**
+ ***************************************
+ * 将缓冲区数据帧内容,放入串口发送数据缓冲区
+ * 输入:无
+ * 返回: 无
+ ***************************************
+ */
+void jt808_send_buf_data(void)
+{
+	if(jt808_obj.send_data.lenth == 0)
+	{
+		return;
+	}
+	//将缓冲区数据帧内容,放入串口发送数据缓冲区
+	memcpy(USART1_TX_BUF,jt808_obj.send_data.buf,jt808_obj.send_data.lenth);
+	
+	//发送次数进行累加
+	jt808_obj.send_data.send_cnt++;
+	
+	//通过串口将数据发送出去
+	TerminalSlave485_Send_Data(USART1_TX_BUF,jt808_obj.send_data.lenth);
+	
+	return;
+}
+/**
+ ***************************************
+ * 处理接收到的返回数据帧
+ * 输入:无
+ * 返回: 无
+ ***************************************
+ */
+JT808_DataBack_DATA jt808_data_back  = {0}; 
+void jt808_recv_func_DataBack(uint8_t * buf ,uint8_t len)
+{
+	uint32_t 		read_len = 0;
+	
+	jt808_obj.back_cnt = 0;
+	
+	memcpy(&jt808_data_back, buf ,sizeof(jt808_data_back));
+	mem_swap((uint8_t *)&(jt808_data_back.flowID),sizeof(jt808_data_back.flowID));
+	
+	if(jt808_data_back.flowID  == jt808_obj.send_data.flowID)
+	{
+		//清除发送缓冲区数据
+		memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
+		//从内存数据栈中读取缓冲数据
+		read_len = func_ram_record_delete((void *)&(jt808_obj.send_data), DATA_UNIT_SIZE);
+		if( read_len != DATA_UNIT_SIZE)
+		{
+			memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
+		}
+		
+		//如果本帧数据重发次数大于5,则清除本帧数据
+		if(jt808_obj.send_data.send_cnt > 5)
+		{
+			memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
+		}
+	}
+	return;
+}
+/**
+ ***************************************
+ * 将发送缓冲区中的数据,放入RAM,并将当前
+ * 产生的数据放入缓冲区
+ * 输入:无
+ * 返回: 无
+ ***************************************
+ */
+
+void jt808_save_send_data(uint8_t * buf ,uint16_t len)
+{
+	
+	if(jt808_obj.send_data.flowID != 0)
+	{
+		func_ram_record_write((uint8_t *)&(jt808_obj.send_data) , DATA_UNIT_SIZE);
+		memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
+	}
+	
+	jt808_obj.send_data.flowID 	= jt808_obj.flowID;
+	jt808_obj.send_data.lenth 	= len;	
+	
+	if(len > sizeof(jt808_obj.send_data.buf))
+	{
+		len = sizeof(jt808_obj.send_data.buf);
+	}
+	memset(jt808_obj.send_data.buf, 0x00, sizeof(jt808_obj.send_data.buf));
+	memcpy(jt808_obj.send_data.buf, buf,  len);
+		
+	return;
+}
+/**
+ ***************************************
+ * xy,新透传,41串口透传,模拟F3轮询传感器
+ * 按照周期1构建数据,按照周期2发送数据
+ * 输入:无
+ * 返回: 无
+ *    发送区的格式为:
+ *       数据负载类别,1Byte
+ *       传感器命令数据包数,1Byte
+ *       具体的各个命令数据包,NByte
+ ***************************************
+ */
+void jt808_DoInternalSensorScanAndPost(void)
+{
+	int xlen=0, ylen=0;
+	uint8_t emergencyflag=0;
+	uint8_t *pSendBuf = USART1_TX_BUF;
+	static int step = 0;
+	static int nstep = 0;
+
+	if(++step % Pass41SensorScanParam.step == 0)
+	{	
+		for(int n=0; n<Pass41SensorScanParam.cmd_num; n++) {
+			switch (Pass41SensorScanParam.cmd_arr[n]){
+			case 0x40:
+				xlen = jt808_BuildSealTxCmd(pSendBuf, emergencyflag?NULL:&emergencyflag);
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			case 0x91:
+				xlen = jt808_Build91Cmd(pSendBuf, emergencyflag?NULL:&emergencyflag);
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			case 0xA1:
+				xlen = jt808_Build_A1_Cmd(pSendBuf, jt808_obj.flowID, emergencyflag?NULL:&emergencyflag); 
+				pSendBuf += xlen;
+			    ylen += xlen;
+				break;
+			default:
+				break;
+			}
+		}
+		
+		
+		
+		if(emergencyflag) 
+		{
+			TerminalSlave485_Send_Data(USART1_TX_BUF, ylen);
+			//保存发送数据
+			jt808_save_send_data(USART1_TX_BUF, ylen);
+			nstep = 0;
+			emergencyflag = 0;
+			jt808_obj.flowID++;
+		}
+		else
+		{
+			if(++nstep % Pass41SensorScanParam.nstep == 0) 
+			{
+				TerminalSlave485_Send_Data(USART1_TX_BUF,ylen);
+				//保存发送数据
+				jt808_save_send_data(USART1_TX_BUF,ylen);
+				
+				//检测当前连接状态,每一大循环执行一次
+				jt808_link_check();
+				
+				jt808_obj.flowID++;
+			}
+			else if(nstep % Pass41SensorScanParam.nstep == (Pass41SensorScanParam.nstep/2)) 
+			{
+				//重发缓冲区数据
+				if(jt808_obj.link_ok == true)	//如果连接正常,则重发数据;
+				{
+					 jt808_send_buf_data();
+				}
+
+			}				
+		}
+	}
+	
+	jt808_obj.back_cnt++;
+	
+	return;
+}
+/**
+ ***************************************
+ * 初始化发送配置参数
+ * 输入:无
+ * 返回: 无
+ ***************************************
+ */
+
+void jt808_InitSensorScanParam(void)
+{
+	uint8_t data[16];
+	//初始化补传缓冲区内存
+	func_ram_record_init();
+	
+	FM25L16B_Read_N_Bytes(ADDR_Sensor_Scan_Param, data, 16);
+	if(data[0] == 0x5A){
+		uint8_t *buf = data+1;
+		Pass41SensorScanParam.enable = 1;
+		if(buf[0] > 1 && buf[1] > 0){
+			Pass41SensorScanParam.step = buf[0];
+			Pass41SensorScanParam.nstep = buf[1];
+			if(buf[2] > 0 && buf[2] <= 8){
+				Pass41SensorScanParam.cmd_num = buf[2];
+				for (int n = 0; n < Pass41SensorScanParam.cmd_num; n++){
+					Pass41SensorScanParam.cmd_arr[n] = buf[3+n];
+				}
+			}else{
+				Pass41SensorScanParam.cmd_num = 2;
+				Pass41SensorScanParam.cmd_arr[0] = 0x40;
+				Pass41SensorScanParam.cmd_arr[1] = 0x91;
+			}	
+		}else{
+			Pass41SensorScanParam.step = 5;
+			Pass41SensorScanParam.nstep = 6;
+			Pass41SensorScanParam.cmd_num = 2;
+			Pass41SensorScanParam.cmd_arr[0] = 0x40;
+			Pass41SensorScanParam.cmd_arr[1] = 0x91;
+		}
+	}else{
+		Pass41SensorScanParam.enable = 0;
+		Pass41SensorScanParam.step = 5;
+		Pass41SensorScanParam.nstep = 6;
+		Pass41SensorScanParam.cmd_num = 2;
+		Pass41SensorScanParam.cmd_arr[0] = 0x40;
+		Pass41SensorScanParam.cmd_arr[1] = 0x91;
+	}
+}
+
+#endif    /*************APP_TERMINALSLAVE485_JT808_USE*******************/

+ 54 - 0
Src/TerminalSlave485_jt808.h

@@ -0,0 +1,54 @@
+/*********************************************************
+//file		:.h
+//author	:boly
+//date		:2021/10/21
+//version	:V1.0
+//brief		:
+*********************************************************/
+#ifndef TERMINALSLAVE485_JT808_H
+#define TERMINALSLAVE485_JT808_H
+
+/* Includes----------------------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h> 
+/* Public macro------------------------------------------------------------------------------*/
+
+/* Public define-----------------------------------------------------------------------------*/
+
+/* Public typedef----------------------------------------------------------------------------*/
+
+#pragma pack(1)
+
+typedef struct JT808_DataBack_DATA
+{
+	uint32_t flowID;  //Y为32Bit的流水号-高位在前,此流水号来源于控制板主动上报的传感器数据包内,如A1封装
+	uint8_t  ret; 		//值00:成功;其他值:异常	
+}JT808_DataBack_DATA; 
+
+#pragma pack() //取消1字节对齐,恢复为默认4字节对齐
+
+typedef struct
+{
+	uint8_t enable; // 对应存储区首地址字节内容为0x5A,表示使能开启
+	uint8_t step;  // 构建周期
+	uint8_t nstep; // 上报周期,是step的倍数
+	uint8_t cmd_num;  // 命令数据的总数
+	uint8_t cmd_arr[12] ;  // 挨个具体存放命令代号
+
+	uint8_t rx_buf[5]; // 通过41串口透传uart口接收头部内容的缓存区
+}Pass41SensorScanParam_TypeDef; 
+
+/* public function---------------------------------------------------------------------------*/
+
+extern Pass41SensorScanParam_TypeDef Pass41SensorScanParam;
+
+void jt808_InitSensorScanParam(void);
+void jt808_DoInternalSensorScanAndPost(void);
+void jt808_recv_func_DataBack(uint8_t * buf ,uint8_t len);
+
+
+
+#endif    /*********TERMINALSLAVE485_JT808_H****************/
+/******************************the end of file************************************************/
+