~aleteoryx/muditaos

ref: 0e8b4c848e3f87f3bbb1f64ef7460cf56017b87f muditaos/module-vfs/drivers/src/thirdparty/fatfs/ffsystem.cpp -rw-r--r-- 4.3 KiB
0e8b4c84 — Lefucjusz [BH-2108] Fix misaligned charging symbol 3 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md

/*------------------------------------------------------------------------*/
/* Sample Code of OS Dependent Functions for FatFs                        */
/* (C)ChaN, 2018                                                          */
/*------------------------------------------------------------------------*/

#include "FreeRTOS.h"
#include "semphr.h"
#include "ff.h"
#include <cstdlib>

#if FF_USE_LFN == 3 /* Dynamic memory allocation */

/*------------------------------------------------------------------------*/
/* Allocate a memory block                                                */
/*------------------------------------------------------------------------*/

extern "C" void *ff_memalloc(           /* Returns pointer to the allocated memory block (null if not enough core) */
                             UINT msize /* Number of bytes to allocate */
)
{
    return std::malloc(msize);
}

/*------------------------------------------------------------------------*/
/* Free a memory block                                                    */
/*------------------------------------------------------------------------*/

extern "C" void ff_memfree(void *mblock /* Pointer to the memory block to free (nothing to do if null) */
)
{
    std::free(mblock); /* Free the memory block with POSIX API */
}

#endif

#if FF_FS_REENTRANT /* Mutual 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 */

extern "C" 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 */
)
{
    /* FreeRTOS */
    *sobj = xSemaphoreCreateMutex();
    return static_cast<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.
*/

extern "C" 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 */
)
{
    /* FreeRTOS */
    vSemaphoreDelete(sobj);
    return 1;
}

/*------------------------------------------------------------------------*/
/* Request Grant to Access the Volume                                     */
/*------------------------------------------------------------------------*/
/* This function is called on entering file functions to lock the volume.
/  When a 0 is returned, the file function fails with FR_TIMEOUT.
*/

extern "C" 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 */
)
{
    /* FreeRTOS */
    return static_cast<int>(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE);
}

/*------------------------------------------------------------------------*/
/* Release Grant to Access the Volume                                     */
/*------------------------------------------------------------------------*/
/* This function is called on leaving file functions to unlock the volume.
 */

extern "C" void ff_rel_grant(FF_SYNC_t sobj /* Sync object to be signaled */
)
{
    /* FreeRTOS */
    xSemaphoreGive(sobj);
}

#endif