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