208 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			208 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* A Sample Code of User Provided OS Dependent Functions for FatFs        */
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "ff.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if FF_USE_LFN == 3	/* Use dynamic memory allocation */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Allocate/Free a Memory Block                                           */
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>		/* with POSIX API */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void* ff_memalloc (	/* Returns pointer to the allocated memory block (null if not enough core) */
							 | 
						||
| 
								 | 
							
									UINT msize		/* Number of bytes to allocate */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return malloc((size_t)msize);	/* Allocate a new memory block */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void ff_memfree (
							 | 
						||
| 
								 | 
							
									void* mblock	/* Pointer to the memory block to free (no effect if null) */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									free(mblock);	/* Free the memory block */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if FF_FS_REENTRANT	/* Mutal exclusion */
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Definitions of Mutex                                                   */
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define OS_TYPE	0	/* 0:Win32, 1:uITRON4.0, 2:uC/OS-II, 3:FreeRTOS, 4:CMSIS-RTOS */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if   OS_TYPE == 0	/* Win32 */
							 | 
						||
| 
								 | 
							
								#include <windows.h>
							 | 
						||
| 
								 | 
							
								static HANDLE Mutex[FF_VOLUMES + 1];	/* Table of mutex handle */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 1	/* uITRON */
							 | 
						||
| 
								 | 
							
								#include "itron.h"
							 | 
						||
| 
								 | 
							
								#include "kernel.h"
							 | 
						||
| 
								 | 
							
								static mtxid Mutex[FF_VOLUMES + 1];		/* Table of mutex ID */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 2	/* uc/OS-II */
							 | 
						||
| 
								 | 
							
								#include "includes.h"
							 | 
						||
| 
								 | 
							
								static OS_EVENT *Mutex[FF_VOLUMES + 1];	/* Table of mutex pinter */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 3	/* FreeRTOS */
							 | 
						||
| 
								 | 
							
								#include "FreeRTOS.h"
							 | 
						||
| 
								 | 
							
								#include "semphr.h"
							 | 
						||
| 
								 | 
							
								static SemaphoreHandle_t Mutex[FF_VOLUMES + 1];	/* Table of mutex handle */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 4	/* CMSIS-RTOS */
							 | 
						||
| 
								 | 
							
								#include "cmsis_os.h"
							 | 
						||
| 
								 | 
							
								static osMutexId Mutex[FF_VOLUMES + 1];	/* Table of mutex ID */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Create a Mutex                                                         */
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* This function is called in f_mount function to create a new mutex
							 | 
						||
| 
								 | 
							
								/  or semaphore for the volume. When a 0 is returned, the f_mount function
							 | 
						||
| 
								 | 
							
								/  fails with FR_INT_ERR.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int ff_mutex_create (	/* Returns 1:Function succeeded or 0:Could not create the mutex */
							 | 
						||
| 
								 | 
							
									int vol				/* Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES) */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if OS_TYPE == 0	/* Win32 */
							 | 
						||
| 
								 | 
							
									Mutex[vol] = CreateMutex(NULL, FALSE, NULL);
							 | 
						||
| 
								 | 
							
									return (int)(Mutex[vol] != INVALID_HANDLE_VALUE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 1	/* uITRON */
							 | 
						||
| 
								 | 
							
									T_CMTX cmtx = {TA_TPRI,1};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Mutex[vol] = acre_mtx(&cmtx);
							 | 
						||
| 
								 | 
							
									return (int)(Mutex[vol] > 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 2	/* uC/OS-II */
							 | 
						||
| 
								 | 
							
									OS_ERR err;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Mutex[vol] = OSMutexCreate(0, &err);
							 | 
						||
| 
								 | 
							
									return (int)(err == OS_NO_ERR);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 3	/* FreeRTOS */
							 | 
						||
| 
								 | 
							
									Mutex[vol] = xSemaphoreCreateMutex();
							 | 
						||
| 
								 | 
							
									return (int)(Mutex[vol] != NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 4	/* CMSIS-RTOS */
							 | 
						||
| 
								 | 
							
									osMutexDef(cmsis_os_mutex);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Mutex[vol] = osMutexCreate(osMutex(cmsis_os_mutex));
							 | 
						||
| 
								 | 
							
									return (int)(Mutex[vol] != NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Delete a Mutex                                                         */
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* This function is called in f_mount function to delete a mutex or
							 | 
						||
| 
								 | 
							
								/  semaphore of the volume created with ff_mutex_create function.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void ff_mutex_delete (	/* Returns 1:Function succeeded or 0:Could not delete due to an error */
							 | 
						||
| 
								 | 
							
									int vol				/* Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES) */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if OS_TYPE == 0	/* Win32 */
							 | 
						||
| 
								 | 
							
									CloseHandle(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 1	/* uITRON */
							 | 
						||
| 
								 | 
							
									del_mtx(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 2	/* uC/OS-II */
							 | 
						||
| 
								 | 
							
									OS_ERR err;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									OSMutexDel(Mutex[vol], OS_DEL_ALWAYS, &err);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 3	/* FreeRTOS */
							 | 
						||
| 
								 | 
							
									vSemaphoreDelete(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 4	/* CMSIS-RTOS */
							 | 
						||
| 
								 | 
							
									osMutexDelete(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Request a Grant to Access the Volume                                   */
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* This function is called on enter file functions to lock the volume.
							 | 
						||
| 
								 | 
							
								/  When a 0 is returned, the file function fails with FR_TIMEOUT.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int ff_mutex_take (	/* Returns 1:Succeeded or 0:Timeout */
							 | 
						||
| 
								 | 
							
									int vol			/* Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES) */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if OS_TYPE == 0	/* Win32 */
							 | 
						||
| 
								 | 
							
									return (int)(WaitForSingleObject(Mutex[vol], FF_FS_TIMEOUT) == WAIT_OBJECT_0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 1	/* uITRON */
							 | 
						||
| 
								 | 
							
									return (int)(tloc_mtx(Mutex[vol], FF_FS_TIMEOUT) == E_OK);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 2	/* uC/OS-II */
							 | 
						||
| 
								 | 
							
									OS_ERR err;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									OSMutexPend(Mutex[vol], FF_FS_TIMEOUT, &err));
							 | 
						||
| 
								 | 
							
									return (int)(err == OS_NO_ERR);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 3	/* FreeRTOS */
							 | 
						||
| 
								 | 
							
									return (int)(xSemaphoreTake(Mutex[vol], FF_FS_TIMEOUT) == pdTRUE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 4	/* CMSIS-RTOS */
							 | 
						||
| 
								 | 
							
									return (int)(osMutexWait(Mutex[vol], FF_FS_TIMEOUT) == osOK);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Release a Grant to Access the Volume                                   */
							 | 
						||
| 
								 | 
							
								/*------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* This function is called on leave file functions to unlock the volume.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void ff_mutex_give (
							 | 
						||
| 
								 | 
							
									int vol			/* Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES) */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if OS_TYPE == 0	/* Win32 */
							 | 
						||
| 
								 | 
							
									ReleaseMutex(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 1	/* uITRON */
							 | 
						||
| 
								 | 
							
									unl_mtx(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 2	/* uC/OS-II */
							 | 
						||
| 
								 | 
							
									OSMutexPost(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 3	/* FreeRTOS */
							 | 
						||
| 
								 | 
							
									xSemaphoreGive(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#elif OS_TYPE == 4	/* CMSIS-RTOS */
							 | 
						||
| 
								 | 
							
									osMutexRelease(Mutex[vol]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif	/* FF_FS_REENTRANT */
							 |