| /*------------------------------------------------------------------------*/ |
| /* Sample Code of OS Dependent Functions for FatFs */ |
| /* (C)ChaN, 2018 */ |
| /*------------------------------------------------------------------------*/ |
| |
| |
| #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 if 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 if 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]; /* Table of CMSIS-RTOS mutex */ |
| |
| |
| 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 |
| |