You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
4.8 KiB
171 lines
4.8 KiB
/*------------------------------------------------------------------------*/ |
|
/* Sample Code of OS Dependent Functions for FatFs */ |
|
/* (C)ChaN, 2017 */ |
|
/*------------------------------------------------------------------------*/ |
|
|
|
|
|
#include "ff.h" |
|
|
|
|
|
|
|
#if FF_USE_LFN == 3 /* Dynamic memory allocation */ |
|
|
|
/*------------------------------------------------------------------------*/ |
|
/* Allocate a memory block */ |
|
/*------------------------------------------------------------------------*/ |
|
|
|
void* ff_memalloc ( /* Returns pointer to the allocated memory block (null on not enough core) */ |
|
UINT msize /* Number of bytes to allocate */ |
|
) |
|
{ |
|
return 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 (nothing to do for null) */ |
|
) |
|
{ |
|
free(mblock); /* Free the memory block with POSIX API */ |
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
#if FF_FS_REENTRANT /* Mutal exclusion */ |
|
|
|
/*------------------------------------------------------------------------*/ |
|
/* Create a Synchronization Object */ |
|
/*------------------------------------------------------------------------*/ |
|
/* This function is called in f_mount() function to create a new |
|
/ synchronization object for the volume, such as semaphore and mutex. |
|
/ When a 0 is returned, the f_mount() function fails with FR_INT_ERR. |
|
*/ |
|
|
|
//const osMutexDef_t Mutex[FF_VOLUMES]; /* CMSIS-RTOS */ |
|
|
|
|
|
int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */ |
|
BYTE vol, /* Corresponding volume (logical drive number) */ |
|
FF_SYNC_t* sobj /* Pointer to return the created sync object */ |
|
) |
|
{ |
|
/* Win32 */ |
|
*sobj = CreateMutex(NULL, FALSE, NULL); |
|
return (int)(*sobj != INVALID_HANDLE_VALUE); |
|
|
|
/* uITRON */ |
|
// T_CSEM csem = {TA_TPRI,1,1}; |
|
// *sobj = acre_sem(&csem); |
|
// return (int)(*sobj > 0); |
|
|
|
/* uC/OS-II */ |
|
// OS_ERR err; |
|
// *sobj = OSMutexCreate(0, &err); |
|
// return (int)(err == OS_NO_ERR); |
|
|
|
/* FreeRTOS */ |
|
// *sobj = xSemaphoreCreateMutex(); |
|
// return (int)(*sobj != NULL); |
|
|
|
/* CMSIS-RTOS */ |
|
// *sobj = osMutexCreate(Mutex + vol); |
|
// return (int)(*sobj != NULL); |
|
} |
|
|
|
|
|
/*------------------------------------------------------------------------*/ |
|
/* 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 an error */ |
|
FF_SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ |
|
) |
|
{ |
|
/* Win32 */ |
|
return (int)CloseHandle(sobj); |
|
|
|
/* uITRON */ |
|
// return (int)(del_sem(sobj) == E_OK); |
|
|
|
/* uC/OS-II */ |
|
// OS_ERR err; |
|
// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); |
|
// return (int)(err == OS_NO_ERR); |
|
|
|
/* FreeRTOS */ |
|
// vSemaphoreDelete(sobj); |
|
// return 1; |
|
|
|
/* CMSIS-RTOS */ |
|
// return (int)(osMutexDelete(sobj) == osOK); |
|
} |
|
|
|
|
|
/*------------------------------------------------------------------------*/ |
|
/* 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 */ |
|
FF_SYNC_t sobj /* Sync object to wait */ |
|
) |
|
{ |
|
/* Win32 */ |
|
return (int)(WaitForSingleObject(sobj, FF_FS_TIMEOUT) == WAIT_OBJECT_0); |
|
|
|
/* uITRON */ |
|
// return (int)(wai_sem(sobj) == E_OK); |
|
|
|
/* uC/OS-II */ |
|
// OS_ERR err; |
|
// OSMutexPend(sobj, FF_FS_TIMEOUT, &err)); |
|
// return (int)(err == OS_NO_ERR); |
|
|
|
/* FreeRTOS */ |
|
// return (int)(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE); |
|
|
|
/* CMSIS-RTOS */ |
|
// return (int)(osMutexWait(sobj, FF_FS_TIMEOUT) == osOK); |
|
} |
|
|
|
|
|
/*------------------------------------------------------------------------*/ |
|
/* Release Grant to Access the Volume */ |
|
/*------------------------------------------------------------------------*/ |
|
/* This function is called on leaving file functions to unlock the volume. |
|
*/ |
|
|
|
void ff_rel_grant ( |
|
FF_SYNC_t sobj /* Sync object to be signaled */ |
|
) |
|
{ |
|
/* Win32 */ |
|
ReleaseMutex(sobj); |
|
|
|
/* uITRON */ |
|
// sig_sem(sobj); |
|
|
|
/* uC/OS-II */ |
|
// OSMutexPost(sobj); |
|
|
|
/* FreeRTOS */ |
|
// xSemaphoreGive(sobj); |
|
|
|
/* CMSIS-RTOS */ |
|
// osMutexRelease(sobj); |
|
} |
|
|
|
#endif |
|
|
|
|