CMSIS2000  0.0.7
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
syscall.c
Go to the documentation of this file.
1 /*------------------------------------------------------------------------*/
2 /* Sample code of OS dependent controls for FatFs */
3 /* (C)ChaN, 2012 */
4 /*------------------------------------------------------------------------*/
5 
6 #include <stdlib.h> /* ANSI memory controls */
7 #include <malloc.h> /* ANSI memory controls */
8 
9 #include "../ff.h"
10 
11 
12 #if _FS_REENTRANT
13 /*------------------------------------------------------------------------*/
14 /* Create a Synchronization Object
15 /*------------------------------------------------------------------------*/
16 /* This function is called in f_mount function to create a new
17 / synchronization object, such as semaphore and mutex. When a FALSE is
18 / returned, the f_mount function fails with FR_INT_ERR.
19 */
20 
21 int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create due to any error */
22  BYTE vol, /* Corresponding logical drive being processed */
23  _SYNC_t *sobj /* Pointer to return the created sync object */
24 )
25 {
26  int ret;
27 // static _SYNC_t sem[_VOLUMES]; /* FreeRTOS */
28 
29 
30  *sobj = CreateMutex(NULL, FALSE, NULL); /* Win32 */
31  ret = (*sobj != INVALID_HANDLE_VALUE);
32 
33 // *sobj = SyncObjects[vol]; /* uITRON (give a static created sync object) */
34 // ret = 1; /* The initial value of the semaphore must be 1. */
35 
36 // *sobj = OSMutexCreate(0, &err); /* uC/OS-II */
37 // ret = (err == OS_NO_ERR);
38 
39 // if (!sem[vol]) /* FreeRTOS */
40 // sem[vol] = xSemaphoreCreateMutex();
41 // *sobj = sem[vol];
42 // ret = (*sobj != NULL);
43 
44  return ret;
45 }
46 
47 
48 
49 /*------------------------------------------------------------------------*/
50 /* Delete a Synchronization Object */
51 /*------------------------------------------------------------------------*/
52 /* This function is called in f_mount function to delete a synchronization
53 / object that created with ff_cre_syncobj function. When a FALSE is
54 / returned, the f_mount function fails with FR_INT_ERR.
55 */
56 
57 int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to any error */
58  _SYNC_t sobj /* Sync object tied to the logical drive to be deleted */
59 )
60 {
61  int ret;
62 
63 
64  ret = CloseHandle(sobj); /* Win32 */
65 
66 // ret = 1; /* uITRON (nothing to do) */
67 
68 // OSMutexDel(sobj, OS_DEL_ALWAYS, &err); /* uC/OS-II */
69 // ret = (err == OS_NO_ERR);
70 
71 // ret = 1; /* FreeRTOS (nothing to do) */
72 
73  return ret;
74 }
75 
76 
77 
78 /*------------------------------------------------------------------------*/
79 /* Request Grant to Access the Volume */
80 /*------------------------------------------------------------------------*/
81 /* This function is called on entering file functions to lock the volume.
82 / When a FALSE is returned, the file function fails with FR_TIMEOUT.
83 */
84 
85 int ff_req_grant ( /* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */
86  _SYNC_t sobj /* Sync object to wait */
87 )
88 {
89  int ret;
90 
91  ret = (WaitForSingleObject(sobj, _FS_TIMEOUT) == WAIT_OBJECT_0); /* Win32 */
92 
93 // ret = (wai_sem(sobj) == E_OK); /* uITRON */
94 
95 // OSMutexPend(sobj, _FS_TIMEOUT, &err)); /* uC/OS-II */
96 // ret = (err == OS_NO_ERR);
97 
98 // ret = (xSemaphoreTake(sobj, _FS_TIMEOUT) == pdTRUE); /* FreeRTOS */
99 
100  return ret;
101 }
102 
103 
104 
105 /*------------------------------------------------------------------------*/
106 /* Release Grant to Access the Volume */
107 /*------------------------------------------------------------------------*/
108 /* This function is called on leaving file functions to unlock the volume.
109 */
110 
111 void ff_rel_grant (
112  _SYNC_t sobj /* Sync object to be signaled */
113 )
114 {
115  ReleaseMutex(sobj); /* Win32 */
116 
117 // sig_sem(sobj); /* uITRON */
118 
119 // OSMutexPost(sobj); /* uC/OS-II */
120 
121 // xSemaphoreGive(sobj); /* FreeRTOS */
122 }
123 
124 #endif
125 
126 
127 
128 
129 #if _USE_LFN == 3 /* LFN with a working buffer on the heap */
130 /*------------------------------------------------------------------------*/
131 /* Allocate a memory block */
132 /*------------------------------------------------------------------------*/
133 /* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE.
134 */
135 
136 void* ff_memalloc ( /* Returns pointer to the allocated memory block */
137  UINT msize /* Number of bytes to allocate */
138 )
139 {
140  return malloc(msize);
141 }
142 
143 
144 /*------------------------------------------------------------------------*/
145 /* Free a memory block */
146 /*------------------------------------------------------------------------*/
147 
148 void ff_memfree (
149  void* mblock /* Pointer to the memory block to free */
150 )
151 {
152  free(mblock);
153 }
154 
155 #endif