]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/FreeRTOS-Plus-FAT-SL/fat_sl/common/util.c
Update FreeRTOS+FAT SL to version 1.0.1.
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-FAT-SL / fat_sl / common / util.c
1 /*\r
2  * FreeRTOS+FAT SL V1.0.1 (C) 2014 HCC Embedded\r
3  *\r
4  * The FreeRTOS+FAT SL license terms are different to the FreeRTOS license \r
5  * terms.\r
6  * \r
7  * FreeRTOS+FAT SL uses a dual license model that allows the software to be used \r
8  * under a standard GPL open source license, or a commercial license.  The \r
9  * standard GPL license (unlike the modified GPL license under which FreeRTOS \r
10  * itself is distributed) requires that all software statically linked with \r
11  * FreeRTOS+FAT SL is also distributed under the same GPL V2 license terms.  \r
12  * Details of both license options follow:\r
13  * \r
14  * - Open source licensing -\r
15  * FreeRTOS+FAT SL is a free download and may be used, modified, evaluated and\r
16  * distributed without charge provided the user adheres to version two of the \r
17  * GNU General Public License (GPL) and does not remove the copyright notice or \r
18  * this text.  The GPL V2 text is available on the gnu.org web site, and on the\r
19  * following URL: http://www.FreeRTOS.org/gpl-2.0.txt.\r
20  * \r
21  * - Commercial licensing -\r
22  * Businesses and individuals who for commercial or other reasons cannot comply\r
23  * with the terms of the GPL V2 license must obtain a commercial license before \r
24  * incorporating FreeRTOS+FAT SL into proprietary software for distribution in \r
25  * any form.  Commercial licenses can be purchased from \r
26  * http://shop.freertos.org/fat_sl and do not require any source files to be \r
27  * changed.\r
28  *\r
29  * FreeRTOS+FAT SL is distributed in the hope that it will be useful.  You\r
30  * cannot use FreeRTOS+FAT SL unless you agree that you use the software 'as\r
31  * is'.  FreeRTOS+FAT SL is provided WITHOUT ANY WARRANTY; without even the\r
32  * implied warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A\r
33  * PARTICULAR PURPOSE. Real Time Engineers Ltd. and HCC Embedded disclaims all\r
34  * conditions and terms, be they implied, expressed, or statutory.\r
35  *\r
36  * http://www.FreeRTOS.org\r
37  * http://www.FreeRTOS.org/FreeRTOS-Plus\r
38  *\r
39  */\r
40 \r
41 #include "../../api/fat_sl.h"\r
42 #include "../../psp/include/psp_rtc.h"\r
43 #include "dir.h"\r
44 \r
45 #include "util.h"\r
46 \r
47 #include "../../version/ver_fat_sl.h"\r
48 #if VER_FAT_SL_MAJOR != 5 || VER_FAT_SL_MINOR != 2\r
49  #error Incompatible FAT_SL version number!\r
50 #endif\r
51 \r
52 \r
53 /****************************************************************************\r
54  *\r
55  * _f_getword\r
56  *\r
57  * get a word 16bit number from a memory (it uses LITTLE ENDIAN mode always)\r
58  *\r
59  * INPUTS\r
60  *\r
61  * ptr - pointer where data is\r
62  *\r
63  * RETURNS\r
64  *\r
65  * word number\r
66  *\r
67  ***************************************************************************/\r
68 unsigned short _f_getword ( void * ptr )\r
69 {\r
70   unsigned char * sptr = (unsigned char *)ptr;\r
71   unsigned short  ret;\r
72 \r
73   ret = (unsigned short)( sptr[1] & 0xff );\r
74   ret <<= 8;\r
75   ret |= ( sptr[0] & 0xff );\r
76   return ret;\r
77 }\r
78 \r
79 \r
80 /****************************************************************************\r
81  *\r
82  * _f_setword\r
83  *\r
84  * set a word 16bit number into a memory (it uses LITTLE ENDIAN mode always)\r
85  *\r
86  * INPUTS\r
87  *\r
88  * ptr - where to store data\r
89  * num - 16 bit number to store\r
90  *\r
91  ***************************************************************************/\r
92 void _f_setword ( void * ptr, unsigned short num )\r
93 {\r
94   unsigned char * sptr = (unsigned char *)ptr;\r
95 \r
96   sptr[1] = (unsigned char)( num >> 8 );\r
97   sptr[0] = (unsigned char)( num );\r
98 }\r
99 \r
100 \r
101 /****************************************************************************\r
102  *\r
103  * _f_getlong\r
104  *\r
105  * get a long 32bit number from a memory (it uses LITTLE ENDIAN mode always)\r
106  *\r
107  * INPUTS\r
108  *\r
109  * ptr - pointer where data is\r
110  *\r
111  * RETURNS\r
112  *\r
113  * long number\r
114  *\r
115  ***************************************************************************/\r
116 unsigned long _f_getlong ( void * ptr )\r
117 {\r
118   unsigned char * sptr = (unsigned char *)ptr;\r
119   unsigned long   ret;\r
120 \r
121   ret = (unsigned long)( sptr[3] & 0xff );\r
122   ret <<= 8;\r
123   ret |= ( sptr[2] & 0xff );\r
124   ret <<= 8;\r
125   ret |= ( sptr[1] & 0xff );\r
126   ret <<= 8;\r
127   ret |= ( sptr[0] & 0xff );\r
128   return ret;\r
129 }\r
130 \r
131 \r
132 /****************************************************************************\r
133  *\r
134  * _f_setlong\r
135  *\r
136  * set a long 32bit number into a memory (it uses LITTLE ENDIAN mode always)\r
137  *\r
138  * INPUTS\r
139  *\r
140  * ptr - where to store data\r
141  * num - 32 bit number to store\r
142  *\r
143  ***************************************************************************/\r
144 void _f_setlong ( void * ptr, unsigned long num )\r
145 {\r
146   unsigned char * sptr = (unsigned char *)ptr;\r
147 \r
148   sptr[3] = (unsigned char)( num >> 24 );\r
149   sptr[2] = (unsigned char)( num >> 16 );\r
150   sptr[1] = (unsigned char)( num >> 8 );\r
151   sptr[0] = (unsigned char)( num );\r
152 }\r
153 \r
154 \r
155 /****************************************************************************\r
156  *\r
157  * _setcharzero\r
158  *\r
159  * fills with zero charater to memory\r
160  *\r
161  * INPUTS\r
162  *\r
163  * num - number of characters\r
164  * ptr - where to store data\r
165  *\r
166  * RETURNS\r
167  *\r
168  * last write position\r
169  *\r
170  ***************************************************************************/\r
171 unsigned char * _setcharzero ( int num, unsigned char * ptr )\r
172 {\r
173   while ( num-- )\r
174   {\r
175     *ptr++ = 0;\r
176   }\r
177 \r
178   return ptr;\r
179 }\r
180 \r
181 \r
182 /****************************************************************************\r
183  *\r
184  * _setchar\r
185  *\r
186  * copy a charater string to memory\r
187  *\r
188  * INPUTS\r
189  *\r
190  * array - original code what to copy\r
191  * num - number of characters\r
192  * ptr - where to store data\r
193  *\r
194  * RETURNS\r
195  *\r
196  * last write position\r
197  *\r
198  ***************************************************************************/\r
199 unsigned char * _setchar ( const unsigned char * array, int num, unsigned char * ptr )\r
200 {\r
201   if ( !array )\r
202   {\r
203     return _setcharzero( num, ptr );\r
204   }\r
205 \r
206   while ( num-- )\r
207   {\r
208     *ptr++ = *array++;\r
209   }\r
210 \r
211   return ptr;\r
212 }\r
213 \r
214 \r
215 /****************************************************************************\r
216  *\r
217  * _setword\r
218  *\r
219  * store a 16bit word into memory\r
220  *\r
221  * INPUTS\r
222  *\r
223  * num - 16bit number to store\r
224  * ptr - where to store data\r
225  *\r
226  * RETURNS\r
227  *\r
228  * last write position\r
229  *\r
230  ***************************************************************************/\r
231 unsigned char * _setword ( unsigned short num, unsigned char * ptr )\r
232 {\r
233   _f_setword( ptr, num );\r
234   return ptr + 2;\r
235 }\r
236 \r
237 \r
238 /****************************************************************************\r
239  *\r
240  * _setlong\r
241  *\r
242  * store a 32bit long number into memory\r
243  *\r
244  * INPUTS\r
245  *\r
246  * num - 32bit number to store\r
247  * ptr - where to store data\r
248  *\r
249  * RETURNS\r
250  *\r
251  * last write position\r
252  *\r
253  ***************************************************************************/\r
254 unsigned char * _setlong ( unsigned long num, unsigned char * ptr )\r
255 {\r
256   _f_setlong( ptr, num );\r
257   return ptr + 4;\r
258 }\r
259 \r
260 \r
261 /****************************************************************************\r
262  *\r
263  * _f_toupper\r
264  *\r
265  * convert a string into lower case\r
266  *\r
267  * INPUTS\r
268  *\r
269  * s - input string to convert\r
270  *\r
271  ***************************************************************************/\r
272 char _f_toupper ( char ch )\r
273 {\r
274   if ( ( ch >= 'a' ) && ( ch <= 'z' ) )\r
275   {\r
276     return (char)( ch - 'a' + 'A' );\r
277   }\r
278 \r
279   return ch;\r
280 }\r
281 \r
282 \r
283 /****************************************************************************\r
284  *\r
285  * f_igettimedate\r
286  *\r
287  * INPUTS\r
288  *    time - pointer to time variable\r
289  *    date - pointer to date variable\r
290  * OUTPUTS\r
291  *    time - current time\r
292  *    date - current date\r
293  *\r
294  * RETURNS\r
295  *    none\r
296  *\r
297  ***************************************************************************/\r
298 void f_igettimedate ( unsigned short * time, unsigned short * date )\r
299 {\r
300   t_psp_timedate  s_timedate;\r
301 \r
302   psp_getcurrenttimedate( &s_timedate );\r
303 \r
304   *time = ( ( (uint16_t)s_timedate.hour << F_CTIME_HOUR_SHIFT ) & F_CTIME_HOUR_MASK )\r
305           | ( ( (uint16_t)s_timedate.min << F_CTIME_MIN_SHIFT )  & F_CTIME_MIN_MASK )\r
306           | ( ( ( (uint16_t)s_timedate.sec >> 1 ) << F_CTIME_SEC_SHIFT )  & F_CTIME_SEC_MASK );\r
307 \r
308   *date = ( ( ( s_timedate.year - 1980 ) << F_CDATE_YEAR_SHIFT ) & F_CDATE_YEAR_MASK )\r
309           | ( ( (uint16_t)s_timedate.month << F_CDATE_MONTH_SHIFT ) & F_CDATE_MONTH_MASK )\r
310           | ( ( (uint16_t)s_timedate.day << F_CDATE_DAY_SHIFT ) & F_CDATE_DAY_MASK );\r
311 \r
312   return;\r
313 }\r
314 \r
315 \r
316 \r
317 \r
318 \r
319 \r
320 \r
321 \r
322 \r